是否有任何保证realloc()将始终缩小缓冲区?以下是:
new_ptr = (data_type *) realloc(old_ptr, new_size * sizeof(data_type));
Run Code Online (Sandbox Code Playgroud)
如果new_size <old_size,则总是会给new_ptr == old_ptr(当然除了new_size == 0).它对我来说似乎是明智的,但它很好奇标准是否强制执行它.
我正在研究非POD数据类型数组的重新分配,如果上述行为得到保证,则认为以下策略可能至少允许有效"缩小":
if (new_size > old_size)
{
// malloc() a new buffer
// use placement copy constructor to copy old objects over
// free() old buffer
}
else
if (new_size < old_size)
{
// explicit destruction of unneeded objects
// realloc() buffer
}
Run Code Online (Sandbox Code Playgroud)
即使数据类型有自引用/指针或其他什么,我希望就地"缩小"会很强大...
pax*_*blo 10
没有.
而已.这些"它可能在一些架构中起作用"或"它应该基于经验".该标准明确指出,该地址可能改变,依靠的是仅此而已.
在编码标准方面:做或不做.没有"尝试":-)
从c99:
realloc函数释放ptr指向的旧对象,并返回指向具有size指定大小的新对象的指针.新对象的内容应与解除分配之前的旧对象的内容相同,直到新旧大小中的较小者为止.新对象中超出旧对象大小的任何字节都具有不确定的值.
如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数.否则,如果ptr与之前由calloc,malloc或realloc函数返回的指针不匹配,或者如果通过调用free或realloc函数释放了空间,则行为未定义.如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改.
realloc函数返回指向新对象的指针(可能与指向旧对象的指针具有相同的值),如果无法分配新对象,则返回空指针.