📌 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 容器! 🚀