释放分配的内存
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和免费。
我只有一个建议。不要为此分配内存,这是浪费精力。
由于app_cfg
是一个文件级别的变量,因此无论如何您一次只能有一个副本,所以在分配和取消分配时没有多大意义。
只需创建它作为一个静态非指针并使用它:
static struct Config_t {
char protocol[LINE_SIZE];
char mode[LINE_SIZE];
} app_cfg;
您仍然可以提供create
和destroy
其memset
结构为零,但即使这样可以不要求:
void create_object (void) {
memset(&app_cfg, 0, sizeof(app_cfg));
}
void destroy_config (void) {
memset(&app_cfg, 0, sizeof(app_cfg));
}
绝对不需要'memset'。它保证是0填充的,因为它是静态的。而摧毁似乎也没有意义。 – 2010-11-22 07:07:31
@Matthew,我在想更多的情况下,你希望它清空之前_reuse_而不是初次使用。但是,即使它在创建/销毁时未被清除,体面的编码人员也不应编写受左值影响的代码,因此我的“可能不需要”评论。 – paxdiablo 2010-11-22 07:09:19
我改变了我的源代码并按照你的建议完成了。只是一个问题。在我的源代码中,我只需要一个结构变量(堆栈层,静态全局)的副本。我想如果我创建了这个结构的许多对象,并希望它们可用于应用程序的生命周期。我想这是使用malloc的一个很好的理由? – ant2009 2010-11-22 07:13:10
使用此代码与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");
}
}
看看它真的“知道”什么时候它是空的。
释放'NULL'并没有错,所以这不是错误的根源。另外,它几乎肯定不是编译器错误。 – 2010-11-22 07:09:44
对我来说看起来不错,你可以发布使用这个指针的代码并调用'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