为什么即使超出范围,存储在 C++ STL 向量中的堆栈分配元素仍然存在?

Why are stack-allocated elements stored in C++ STL vector still alive even if out of scope?

我有以下代码:

#include <vector>
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {

    vector<int > vi;

    for(int i=0; i<10; i++) {
        int j=i*i;
        vi.push_back(j);
    }

    for(int i=0; i<(int)vi.size(); i++)
        cout<<vi[i]<<" ";
    cout<<endl;

    return 1;

}

执行这段代码returns“0 1 4 9 16 25 36 49 64 81”,但这对我来说并不直观。

据我所知,当变量在堆栈上分配时,变量在超出范围时会被取消分配。我也知道 C++ STL 向量存储指向变量的指针。为什么尽管整数已分配到堆栈并超出范围,但向量仍保留有效整数?向量持有的指针不应该因为整数被取消分配而被清空吗?

I also know that C++ STL vectors store pointers to variables.

不,标准容器存储std::vector 包含指向动态分配的内部值数组的指针(在您的例子中,int)。

你的 ints 被复制到向量中,这就是它起作用的原因(没有值语义,容器在许多情况下将无法使用)