所以我有一段用malloc()
分配的内存,稍后用realloc()
更改。
在我的代码中的某个时刻我想要清空它,我的意思是基本上给它0的记忆。用realloc(pointer,0)
直观地做的事情。我在这里读到这是实现定义的,不应该使用。
我应该使用free()
,然后再做一次malloc()
吗?
答案 0 :(得分:12)
这取决于你的意思:如果你想清空使用的内存,但仍然可以访问该内存,那么你使用memset(pointer, 0, mem_size);
重新初始化所述内存为零
如果您不再需要该内存,则只需调用free(pointer);
即可释放内存,以便在其他地方使用。
使用realloc(pointer, 0)
可能与您系统上的free
类似,但这是 不 标准行为。 C99或C11标准未指定realloc(ptr, 0)
等同于free(ptr)
。
realloc(pointer, 0)
不等同于free(pointer)
。标准(C99,§7.22.3.5):
The realloc function Synopsis 1 #include <stdlib.h> void *realloc(void *ptr, size_t size); Description 2 The realloc function deallocates the old object pointed to by ptr and returns a pointer to a new object that has the size specified by size. The contents of the new object shall be the same as that of the old object prior to deallocation, up to the lesser of the new and old sizes. Any bytes in the new object beyond the size of the old object have indeterminate values. 3 If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size. Otherwise, if ptr does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to the free or realloc function, the behavior is undefined. If memory for the new object cannot be allocated, the old object is not deallocated and its value is unchanged. Returns 4 The realloc function returns a pointer to the new object (which may have the same value as a pointer to the old object), or a null pointer if the new object could not be allocated.
正如您所看到的,它没有为大小为0的realloc调用指定一个特殊情况。相反,它只声明在分配内存失败时返回NULL指针,而在所有其他情况下都返回指针。那么,指向0字节的指针将是一个可行的选择。
更直观地说,realloc在另一个指针上与malloc + memcpy + free“在概念上是等价的”,并且对一个0字节的内存块进行malloc-ing返回NULL或者一个唯一的指针,不用于存储任何东西(你要求0字节),但仍然可以释放。所以,不,不要像这样使用realloc,它可能适用于某些实现(即Linux),但肯定无法保证。
正如关于该链接问题的另一个答案所述,根据当前的C11标准,realloc(ptr, 0)
的行为被明确定义为实现定义:
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问对象
答案 1 :(得分:4)
realloc()
用于增加或减少内存,而不是释放内存。
Check this,并使用free()
释放内存(link)。
答案 2 :(得分:3)
我不认为你的意思是&#34;空的&#34 ;;这意味着&#34;将它设置为我认为是空的某个特定值&#34; (通常所有位都为零)。你的意思是免费或解除分配。
如果ptr为
NULL
,则对于malloc(size)
的所有值,该调用等同于size
;如果size
等于零,且ptr
不是NULL
,则该调用等同于free(ptr)
。
传统上,您可以使用realloc(ptr, 0);
作为free(ptr);
的同义词,就像使用realloc(NULL, size);
作为malloc(size);
的同义词一样。我不推荐它,它有点令人困惑,而不是人们期望它被使用的方式。
然而,现在在现代C中,定义已经改变:现在realloc(ptr, 0);
将释放旧内存,但它没有明确定义接下来要做什么:它& #39;实现定义。
所以:不要这样做:使用free()
取消分配内存,让realloc()
仅使用 将大小更改为非零。
答案 3 :(得分:3)
使用free()
释放,释放动态分配的内存。
虽然以前的文件说明realloc(p, 0)
等同于free(p)
,但最新的POSIX documentation明确指出情况并非如此:
以前的版本明确允许调用realloc(p,0)来释放p指向的空格并返回空指针。虽然此行为可能被解释为此版本标准允许,但C语言委员会已表明此解释不正确。
还有更多:
应用程序应该假设如果realloc()返回空指针,则p指向的空间尚未被释放。
答案 4 :(得分:2)
使用free(pointer); pointer = 0
代替realloc(pointer, 0)
。
答案 5 :(得分:2)
void* realloc (void* ptr, size_t size);
在C90:
如果size为零,则先前在ptr分配的内存将被释放,就像调用free一样,并返回一个空指针。
在C99:
如果size为零,则返回值取决于特定的库实现:它可以是空指针或其他不应被解除引用的位置。
答案 6 :(得分:1)
我会使用realloc给出一个或多或少的内存指针,但不要清空它。要清空指针,我会使用free。