gcc 4.4.5 c89befreiend zugewiesenen Speicher
Ich habe eine Funktion namens create_object, wo ich Speicher für eine globale Struktur zuordnen. Und ich habe eine Funktion namens destroy_object, wo ich überprüfe, dass der Zeiger nicht null ist, dann bin ich frei. Nur wenn ich Speicher freistelle, der nicht zugewiesen wurde. Ich habe dies jedoch getestet, indem ich 2 aufeinanderfolgende Aufrufe von destroy_object gemacht habe. Allerdings bekomme ich beim zweiten Aufruf einen Stack-Dump. Ich bin mir aber sicher, dass es nicht frei wird, da ich den Zeiger auf NULL zugewiesen habe. Also sollte die freie Funktion übersprungen werden.
static struct Config_t {
char protocol[LINE_SIZE];
char mode[LINE_SIZE];
} *app_cfg = NULL;
int create_object()
{
app_cfg = malloc(sizeof *app_cfg);
memset(app_cfg, 0, sizeof *app_cfg);
}
void destroy_config()
{
/* Check to see if the memory is ok to free */
if(app_cfg != NULL) {
free(app_cfg);
app_cfg = NULL;
}
}
Vielen Dank für Ihre Anregungen,
================= EDIT ========== Basicially Ich habe in Meine Hauptfunktion ist ein Aufruf von create_object() und ich mache eine Bearbeitung und dann einen Aufruf von destory_object.
int main(void)
{
create_object();
/* Do some processing on the structure */
destroy_object();
return 0;
}
========================= Finale bearbeiten ==== static struct Config_t { char-Protokoll [LINE_SIZE]; Zeichenmodus [LINE_SIZE]; } app_cfg [1] {{"", ""}};
Und jetzt benutze ich nicht malloc und frei.
Das sieht gut aus, können Sie den Code, der diesen Zeiger verwendet, und Aufrufe an 'create_object' und' destroy_config' posten? Wenn Sie Ihren Speicher, der 'app_cfg' zugewiesen ist, sofort auf 0s initialisieren möchten, können Sie auch Ihre' malloc'- und memset'-Aufrufe zu einem 'Calloc'-Aufruf kombinieren. Auch "free" auf einen Nullzeiger ist völlig in Ordnung. – birryree
Das Übergeben eines Null-Zeigers an 'free()' ist ein sicheres No-Op, so dass Sie in 'destroy_config()' nicht die Null-Überprüfung benötigen. – Wyzard
können Sie den Code über gdb ausführen und das Backtrace nach dem SIGSEGV anzeigen? Zeigt es auf einen anderen Ort in Ihrem Programm? – vpit3833