C 如何安全地释放内存?

C 如何安全地释放内存?,c,valgrind,free,C,Valgrind,Free,下面给出的代码给出了未定义的行为,有时代码运行良好,但有时给出了munmap\u chunk错误 char *str = "hello world"; if(str != NULL) free(str) 我在上面的代码中是否有错误 还有如何避免免费复制?如何检查变量是否现在有一些内存/或者以前没有释放过?该字符串没有分配给malloc(),因此不应该使用free()释放它。字符串文本在可执行文件中是静态分配的,而不是在运行时动态分配的。该字符串未使用malloc()分配,因此不应使用free(

下面给出的代码给出了未定义的行为,有时代码运行良好,但有时给出了
munmap\u chunk
错误

char *str = "hello world";
if(str != NULL) free(str)
我在上面的代码中是否有错误


还有如何避免免费复制?如何检查变量是否现在有一些内存/或者以前没有释放过?

该字符串没有分配给
malloc()
,因此不应该使用
free()
释放它。字符串文本在可执行文件中是静态分配的,而不是在运行时动态分配的。

该字符串未使用
malloc()
分配,因此不应使用
free()
释放它。字符串文本是在可执行文件中静态分配的,而不是在运行时动态分配的。

char*str=“hello world”;
如果(str!=NULL)空闲(str)

这是错误的,
*str
不是malloced。“hello world”存储在只读存储器中,您无法释放它; 如果(str!=NULL)空闲(str)


这是错误的,
*str
不是malloced。“hello world”存储在只读内存中,您无法释放它

通常,字符串文本(“hello world”)将存储在数据部分的只读页面中

所以你不能释放他们

如何避免免费复制?

free()将释放指向的内存,但不会将指针设为NULL。每次free()之后,将指针设为NULL

if(str != NULL)
{
 free(str);
 str = NULL;
}

通常,字符串文本(“hello world”)将存储在数据部分的只读页面中

所以你不能释放他们

如何避免免费复制?

free()将释放指向的内存,但不会将指针设为NULL。每次free()之后,将指针设为NULL

if(str != NULL)
{
 free(str);
 str = NULL;
}

我懂了。那么我第二个问题的答案呢?如何避免重复释放?为了避免再次调用free(),在每个free()掩码指针为NULL之后,您将不会再次释放它们…我已经在我的回答中解释了我明白了。那么我第二个问题的答案呢?如何避免重复释放?为了避免再次调用free(),请在每个free()之后将指针屏蔽为NULL,这样您就不会再次释放它们了…我在回答中解释了这是一个错误的好建议。首先,
free(NULL)
是合法有效的,其次,您只隐藏了一个双重free。一个依赖这样一段代码的程序破坏了逻辑。一个依赖这样一段代码的程序破坏了逻辑。。?我不明白这一点。请解释一下?如果你发现自己在一个程序中不知道一块内存被释放了多少次(比如你的情况),那么你的逻辑是错误的。内存应该只释放一次。将指针设置为
NULL
以防止再次释放内存是一个设计问题。这是一个错误的好建议。首先,
free(NULL)
是合法有效的,其次,您只隐藏了一个双重free。一个依赖这样一段代码的程序破坏了逻辑。一个依赖这样一段代码的程序破坏了逻辑。。?我不明白这一点。请解释一下?如果你发现自己在一个程序中不知道一块内存被释放了多少次(比如你的情况),那么你的逻辑是错误的。内存应该只释放一次。将指针设置为
NULL
以防止再次释放内存是一个设计问题。