释放已分配的内存: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 #includevoid * 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给一个或多或少的内存指针,但不要清空它。 要清空指针,我会免费使用。