std:: realloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定义于头文件
<cstdlib>
|
||
|
void
*
realloc
(
void
*
ptr,
std::
size_t
new_size
)
;
|
||
重新分配给定的内存区域(在目标区域
隐式创建
对象)。该内存区域必须先前由
std::malloc
、
std::calloc
或
std::realloc
分配且尚未通过
std::free
释放,否则行为未定义。
重新分配通过以下任一方式完成:
如果内存不足,旧内存块不会被释放并返回空指针。
如果 ptr 是空指针,其行为等同于调用 std:: malloc ( new_size ) 。
如果 new_size 为零,行为由实现定义:可能返回空指针(此时旧内存块可能被释放也可能不被释放),也可能返回某个不可用于访问存储的非空指针。 此类用法已被弃用(通过 C DR 400 )。 (since C++20)
|
以下函数要求是线程安全的:
对这些函数分配或释放特定存储单元的调用以单一全序方式执行,且每个这样的释放调用在该顺序中 先发生于 后续的分配调用(如果存在)。 |
(since C++11) |
目录 |
参数
| ptr | - | 指向需要重新分配的内存区域的指针 |
| new_size | - | 数组的新大小 |
返回值
成功时,返回指向新分配内存起始位置的指针。为避免内存泄漏,必须使用
std::free
或
std::realloc
释放返回的指针。原始指针
ptr
将失效,对其的任何访问均属于
未定义行为
(即使重分配是原地进行的)。
失败时返回空指针。原始指针 ptr 保持有效,可能需要通过 std::free 进行释放。
注释
由于重新分配可能涉及逐字节复制(无论其扩展还是收缩内存区域),这些对象必须是 TriviallyCopyable 类型,这是必要条件(但非充分条件)。
某些非标准库定义了一个类型特征 "BitwiseMovable" 或 "Relocatable",用于描述不具有以下特性的类型:
- 外部引用(例如链表或树中持有另一元素引用的节点),以及
- 内部引用(例如可能持有另一成员地址的成员指针)。
此类对象在其存储被重新分配后仍可被访问,即使它们的复制构造函数并非平凡。
示例
#include <cassert> #include <cstdlib> #include <new> class MallocDynamicBuffer { char* p; public: explicit MallocDynamicBuffer(std::size_t initial = 0) : p(nullptr) { resize(initial); } ~MallocDynamicBuffer() { std::free(p); } void resize(std::size_t newSize) { if (newSize == 0) // 此检查并非严格必需, { std::free(p); // 但零尺寸的realloc在C语言中已被弃用 p = nullptr; } else { if (void* mem = std::realloc(p, newSize)) p = static_cast<char*>(mem); else throw std::bad_alloc(); } } char& operator[](size_t n) { return p[n]; } char operator[](size_t n) const { return p[n]; } }; int main() { MallocDynamicBuffer buf1(1024); buf1[5] = 'f'; buf1.resize(10); // 收缩 assert(buf1[5] == 'f'); buf1.resize(1024); // 扩展 assert(buf1[5] == 'f'); }
参见
|
C 文档
关于
realloc
|