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和免费。
对我来说看起来不错,你可以发布使用这个指针的代码并调用'create_object'和'destroy_config'吗?另外,如果你想立即将分配给'app_cfg'的内存初始化为0,你可以将你的'malloc'和'memset'调用合并成一个'calloc'调用。另外,空指针上的'free'非常好。 – birryree 2010-11-22 05:46:08
将空指针传递给'free()'是一个安全的无操作,所以你不需要'destroy_config()'中的空检查。 – Wyzard 2010-11-22 05:49:58
是否可以通过gdb运行代码并在SIGSEGV引发后查看回溯?它指向程序中的任何其他地方吗? – vpit3833 2010-11-22 06:10:03