Namespaces
Variants

std:: realloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
定义于头文件 <cstdlib>
void * realloc ( void * ptr, std:: size_t new_size ) ;

重新分配给定的内存区域(在目标区域 隐式创建 对象)。该内存区域必须先前由 std::malloc std::calloc std::realloc 分配且尚未通过 std::free 释放,否则行为未定义。

重新分配通过以下任一方式完成:

a) 若可能,扩展或收缩由 ptr 指向的现有内存区域。内存区域的内容将保持至新旧尺寸中较小值的范围。若区域被扩展,数组新增部分的内容是未定义的。
b) 分配一个大小为 new_size 字节的新内存块,复制相当于新旧大小中较小值的内存区域,并释放旧内存块。

如果内存不足,旧内存块不会被释放并返回空指针。

如果 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