释放已分配的内存:realloc()与free()

所以我有一块内存分配了malloc() ,稍后用realloc()更改。

在我的代码中的某些时候我想要清空它,我的意思是基本上给它0的内存。用realloc(pointer,0)直观地做一些事情。 我在这里读到这是实现定义的,不应该使用。

我应该使用free() ,然后再做另一个malloc()吗?

这取决于你的意思:如果你想清空使用的内存 ,但仍然可以访问那个内存,那么你使用memset(pointer, 0, mem_size); ,将所述内存重新初始化为零。
如果你不再需要那个内存,那么你只需要调用free(pointer); ,它将释放内存,因此它可以在别处使用。

使用realloc(pointer, 0)可能在您的系统上像free一样工作,但这不是标准行为。 realloc(ptr, 0)未被C99或C11标准指定为等效于free(ptr)

realloc(pointer, 0)不等于free(pointer)

标准(C99,§7.22.3.5):

 reallocfunction
概要
 1
 #include 
 void * realloc(void * ptr,size_t size);

描述
 2 realloc函数释放ptr指向的旧对象并返回a
指向具有size指定大小的新对象的指针。 新的内容
在解除分配之前,对象应与旧对象的对象相同,直到较小的对象
新旧尺寸。 新对象中超出旧对象大小的任何字节都有
不确定的价值观。
 3如果ptr是空指针,则realloc函数的行为类似于malloc函数
指定大小。 否则,如果ptr与先前由内存返回的指针不匹配
管理function,或者如果通过调用free或者释放空间
 realloc函数,行为未定义。 如果新对象的内存不能
已分配,旧对象未释放,其值不变。
返回
 4
 realloc函数返回一个指向新对象的指针(可能具有相同的指针)
 value作为指向旧对象的指针),如果新对象不可能则为空指针
分配。

正如您所看到的,它没有为realloc调用指定一个特殊情况,其中大小为0.相反,它只声明在分配内存失败时返回NULL指针,而在所有其他情况下都返回指针。 那么,指向0字节的指针将是一个可行的选项。

引用相关问题 :

更直观地说,realloc在另一个指针上与malloc + memcpy + free“在概念上是等价的”,并且malloc-ing 0字节的内存块返回NULL或者是一个唯一的指针,不用于存储任何东西(你问过)为0字节),但仍然被释放。 所以,不,不要像这样使用realloc,它可能适用于某些实现(即Linux),但肯定不能保证。

正如关于该链接问题的另一个答案所述, realloc(ptr, 0)的行为被明确定义为根据当前C11标准定义的实现

如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问对象

realloc()用于增加或减少内存而不是释放内存。

检查一下 ,并使用free()释放内存( 链接 )。

我不认为你的意思是“空洞”; 这意味着“将它设置为我认为是空的某个特定值”(通常所有位都为零)。 你的意思是免费或取消分配。

手册页说:

如果ptr为NULL ,则对于所有size值,调用等效于malloc(size) ; 如果size等于零,并且ptr不为NULL ,则调用等效于free(ptr)

传统上你可以使用realloc(ptr, 0); 作为free(ptr);的同义词free(ptr); ,就像你可以使用realloc(NULL, size); 作为malloc(size);的同义词malloc(size); 。 我不会推荐它,它有点令人困惑,而不是人们期望它被使用的方式。

然而 ,现在在现代C中,定义已经改变:现在realloc(ptr, 0); 将释放旧的内存,但它没有明确定义接下来要做什么:它是实现定义的。

所以:不要这样做:使用free()取消分配内存,让realloc() 用于将大小更改为非零值。

使用free()释放,释放动态分配的内存。

虽然以前的文档声明realloc(p, 0)等同于free(p) ,但最新的POSIX文档明确指出情况并非如此:

以前的版本明确允许调用realloc(p,0)来释放p指向的空格并返回空指针。 虽然此行为可能被解释为此版本标准允许,但C语言委员会已表明此解释不正确。

还有更多:

应用程序应该假设如果realloc()返回空指针,则p指向的空间尚未被释放。

使用free(pointer); pointer = 0 free(pointer); pointer = 0而不是realloc(pointer, 0)

 void* realloc (void* ptr, size_t size); 

在C90:

如果size为零,则先前在ptr分配的内存被释放,就像调用free一样,并返回一个空指针。

在C99中:

如果size为零,则返回值取决于特定的库实现:它可以是空指针或不应解除引用的其他位置。

我会使用realloc给一个或多或少的内存指针,但不要清空它。 要清空指针,我会免费使用。