的C90标准具体表示:
如果尺寸是零并且PTR是不是一个空指针,它指向该对象被释放。
所以这就是C90和C++实现应该如何表现 - 很好,简单和直接。
但是,由于某些原因,该句子已从C99标准中删除。
POSIX目前拥有C90标准中的句子。但是,奥斯汀集团(负责处理POSIX标准化的一些方面)has a defect open on this。注意缺陷报告表明,BSD有realloc(ptr,0)
以下行为:
的realloc(PTR,0)仅给出了ALLOC失败NULL,PTR不变,错误号是ENOMEM
其中我读作说ptr
没有被释放(我没有一个BSD系统来检查这个)。
换句话说,这是一种混乱应该/将发生什么realloc(ptr,0)
- 我不会依赖它释放内存。致电free()
这就是你想要做的。
我不知道什么对C99去除那句话的理由是......
事实上,C99标准实际上似乎从简单的释放块(即排除realloc(ptr,0)
,它似乎并没有离开这个完全定义的实现)。C99标准说:
...如果新对象的内存无法分配,旧的对象不释放其价值是不变的
返回
的realloc函数返回指向新对象的指针(可能与指向旧对象的指针具有相同的值),或者如果无法分配新对象,则为空指针。
因此,如果realloc()
返回NULL
那么无法分配新对象,并且不能释放旧对象。但是,如果realloc()
返回非NULL,那么您仍然有必须释放的对象(或者必须释放的某个新内存对象)。换句话说,如果realloc(ptr,0)
返回NULL
那么你仍然负责释放ptr
。如果realloc(ptr,0)
返回一个非空指针,那么你负责释放返回的指针。
我想也许这就是为什么C99删除了这句话。但是请注意,无论C99可能需要说些什么,许多(大多数?)实现都会在调用realloc(ptr,0)
时释放该块。
使用'“%p”'来打印指针。 –
C中的注释用* forward *斜杠表示,而不是* backward *斜杠,我在编辑中保留了未修正的内容。 –
如果p为NULL,则无法对其解除引用... –