堆栈与堆:临时变量std::vector<int> i; 在堆还是栈上?

在学习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指针指向的地址在堆上。

posted @ 2024-11-26 22:35  ZCry  阅读(105)  评论(0)    收藏  举报