当缓冲区收缩时,realloc是否保证就位?

Dar*_*rda 10 c++

是否有任何保证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函数返回指向新对象的指针(可能与指向旧对象的指针具有相同的值),如果无法分配新对象,则返回空指针.


小智 6

不,你不应该依赖这个.

根据规范7.20.3.4/4:

realloc函数返回指向新对象的指针(可能与指向旧对象的指针具有相同的值),如果无法分配新对象,则返回空指针.