2010-11-22 117 views
1

gcc 4.4.5 c89釋放分配的內存

我有一個名爲create_object的函數,其中我爲全局結構分配內存。我有一個名爲destroy_object的函數,我檢查指針是否爲空,然後我釋放。只需要我釋放尚未分配的內存。不過,我已經通過連續調用2次destroy_object來測試了這一點。但是,我在第二次調用時收到堆棧轉儲。但是,我確定它不會釋放,因爲我已將指針指派給NULL。所以它應該跳過免費功能。

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; 
    } 
} 

非常感謝您的任何建議,

=================編輯========== Basicially我在我的主函數調用了create_object(),我做了一些處理,然後調用destory_object。

int main(void) 
{ 
    create_object(); 

    /* Do some processing on the structure */ 

    destroy_object(); 

    return 0; 
} 

=========================最終編輯==== 靜態結構Config_t { 炭協議[LINE_SIZE]; char mode [LINE_SIZE]; } app_cfg [1] {{「」,「」}};

現在我不使用malloc和免費。

+1

對我來說看起來不錯,你可以發佈使用這個指針的代碼並調用'create_object'和'destroy_config'嗎?另外,如果你想立即將分配給'app_cfg'的內存初始化爲0,你可以將你的'malloc'和'memset'調用合併成一個'calloc'調用。另外,空指針上的'free'非常好。 – birryree 2010-11-22 05:46:08

+1

將空指針傳遞給'free()'是一個安全的無操作,所以你不需要'destroy_config()'中的空檢查。 – Wyzard 2010-11-22 05:49:58

+2

是否可以通過gdb運行代碼並在SIGSEGV引發後查看回溯?它指向程序中的任何其他地方嗎? – vpit3833 2010-11-22 06:10:03

回答

3

我只有一個建議。不要爲此分配內存,這是浪費精力。

由於app_cfg是一個文件級別的變量,因此無論如何您一次只能有一個副本,所以在分配和取消分配時沒有多大意義。

只需創建它作爲一個靜態非指針並使用它:

static struct Config_t { 
    char protocol[LINE_SIZE]; 
    char mode[LINE_SIZE]; 
} app_cfg; 

您仍然可以提供createdestroymemset結構爲零,但即使這樣可以不要求:

void create_object (void) { 
    memset(&app_cfg, 0, sizeof(app_cfg)); 
} 

void destroy_config (void) { 
    memset(&app_cfg, 0, sizeof(app_cfg)); 
} 
+0

絕對不需要'memset'。它保證是0填充的,因爲它是靜態的。而摧毀似乎也沒有意義。 – 2010-11-22 07:07:31

+0

@Matthew,我在想更多的情況下,你希望它清空之前_reuse_而不是初次使用。但是,即使它在創建/銷燬時未被清除,體面的編碼人員也不應編寫受左值影響的代碼,因此我的「可能不需要」評論。 – paxdiablo 2010-11-22 07:09:19

+0

我改變了我的源代碼並按照你的建議完成了。只是一個問題。在我的源代碼中,我只需要一個結構變量(堆棧層,靜態全局)的副本。我想如果我創建了這個結構的許多對象,並希望它們可用於應用程序的生命週期。我想這是使用malloc的一個很好的理由? – ant2009 2010-11-22 07:13:10

2

使用此代碼與GCC 3.3.3下Cygwin正常工作,當我調用它兩次。在這些功能之外,你沒有告訴我們你在做什麼,所以先看看,例如也許你意外地在調用之間爲app_cfg分配了一個非垃圾非空值。另外,如果你沒有使用「大名鼎鼎的」編譯器,那麼這可能是一個編譯器錯誤(例如,它在編譯時可能過於樂觀,並且假設你永遠不會將NULL傳遞給destroy_config)。嘗試把類似的東西:

void destroy_config() 
{ 

    /* Check to see if the memory is ok to free */ 
    if(app_cfg != NULL) { 
     printf("not null\n"); 
     free(app_cfg); 
     app_cfg = NULL; 
    }else{ 
     printf("null\n"); 
     } 
} 

看看它真的「知道」什麼時候它是空的。

+0

釋放'NULL'並沒有錯,所以這不是錯誤的根源。另外,它幾乎肯定不是編譯器錯誤。 – 2010-11-22 07:09:44