reallocate() 和 allocate() 的区别

📌 reallocate() 和 allocate() 的区别

在 C++ 的 std::vector 及其底层内存管理中,allocate() 和 reallocate() 是两个核心的内存管理函数。它们的作用不同:

函数 作用 影响 size() 吗? 影响 capacity() 吗?
allocate(n) 分配 n 个元素的内存(不初始化) ❌ 否 ✅ 是
reallocate(n) 重新分配内存,拷贝旧数据,释放旧内存 ❌ 否 ✅ 是(通常 2 倍扩容)

📌 1. allocate(n): 仅分配内存

🔹 作用 :在 vector 需要更多空间时,allocate(n) 分配 n 个元素的 未初始化内存 ,但不会拷贝旧数据,也不会释放旧内存。

📌 示例

cpp 复制代码
#include <iostream>
#include <memory>  // 使用 std::allocator

int main() {
    std::allocator<int> alloc;
    
    int* arr = alloc.allocate(10); // 分配 10 个 int 空间(未初始化)
    
    for (int i = 0; i < 10; i++) {
        alloc.construct(arr + i, i * 10); // 手动构造对象
    }

    std::cout << "Allocated array: ";
    for (int i = 0; i < 10; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    for (int i = 0; i < 10; i++) {
        alloc.destroy(arr + i); // 手动析构
    }
    alloc.deallocate(arr, 10); // 释放内存

    return 0;
}

📌 输出

复制代码
Allocated array: 0 10 20 30 40 50 60 70 80 90

✅ allocate(n) 只分配内存,不初始化元素!

✅ construct() 负责初始化对象,destroy() 负责析构,deallocate() 负责释放内存。


📌 2. reallocate(n): 重新分配内存

🔹 作用 :当 vector 需要扩容时,reallocate(n) 进行 新内存分配、数据拷贝、释放旧内存 ,从而更新 capacity()。

📌 示例

cpp 复制代码
#include <iostream>
#include <vector>

class MyVector {
private:
    int* _start;
    size_t _size;
    size_t _capacity;

    void reallocate(size_t new_capacity) {  
        int* new_start = new int[new_capacity]; // 分配新内存
        for (size_t i = 0; i < _size; i++) {
            new_start[i] = _start[i];  // 拷贝旧数据
        }
        delete[] _start; // 释放旧内存
        _start = new_start;
        _capacity = new_capacity;
    }

public:
    MyVector() : _start(nullptr), _size(0), _capacity(0) {}

    void push_back(int value) {
        if (_size == _capacity) {  // 触发扩容
            reallocate(_capacity ? _capacity * 2 : 1);
        }
        _start[_size++] = value;
    }

    void print() {
        for (size_t i = 0; i < _size; i++) {
            std::cout << _start[i] << " ";
        }
        std::cout << std::endl;
    }

    ~MyVector() { delete[] _start; } // 释放内存
};

int main() {
    MyVector vec;
    for (int i = 1; i <= 10; i++) {
        vec.push_back(i);
    }
    vec.print();
}

📌 输出

复制代码
1 2 3 4 5 6 7 8 9 10

✅ reallocate() 触发 2x 扩容,拷贝旧数据,释放旧内存!


📌 3. allocate() vs reallocate()

函数 作用 拷贝旧数据? 释放旧内存? 使用场景
allocate(n) 分配新内存,不初始化 ❌ 否 ❌ 否 std::allocator 低级分配
reallocate(n) 重新分配内存,拷贝数据,释放旧内存 ✅ 是 ✅ 是 std::vector 动态扩容

✅ allocate(n) 适用于手动内存管理,reallocate(n) 适用于动态数组扩容!

🚀 掌握 allocate() 和 reallocate(),优化 C++ STL 容器! 🚀

相关推荐
akinggw1 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
繁星蓝雨2 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
旖旎夜光2 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
扶尔魔ocy3 小时前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
akinggw4 小时前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(中):全量响应实现和测试
网络·c++·语言模型·chatgpt
東隅已逝,桑榆非晚5 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
eggwyw6 小时前
C++相交链表和反转链表详解
开发语言·c++
杜 硕6 小时前
从零开始的C++生活——第六讲——02
c++·算法·生活
小超人诞生日记6 小时前
C++ STL 反向迭代器:从源码框架到适配器实现
c++·算法