2010-11-22 115 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