在学习C++ STL的过程中,会遇到很多动态分配内存的情况,以std::vector的实现(简化版)为例:
template <typename T>
class SimpleVector {
private:
T* data; // 指向数据的指针
size_t size_; // 元素数量
size_t capacity_; // 容量
public:
SimpleVector() : data(nullptr), size_(0), capacity_(0) {}
~SimpleVector() { delete[] data; }
void push_back(const T& value) {
if (size_ == capacity_) {
size_t new_capacity = (capacity_ == 0) ? 1 : capacity_ * 2;
T* new_data = new T[new_capacity];
for (size_t i = 0; i < size_; ++i) {
new_data[i] = std::move(data[i]);
}
delete[] data;
data = new_data;
capacity_ = new_capacity;
}
data[size_] = value;
++size_;
}
T& operator[](size_t index) {
return data[index];
}
const T& operator[](size_t index) const {
return data[index];
}
size_t size() const { return size_; }
size_t capacity() const { return capacity_; }
};
当容量不够时便会重新分配内存空间,因此vector实际储存的变量是在堆上的。
如果我们在函数中声明的临时变量,临时变量的实例是在堆栈上,T* data;
本身储存在堆栈上,而data指针指向的地址在堆上。