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

use*_*869 0 c++ stack vector

我有以下代码:

#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;
Run Code Online (Sandbox Code Playgroud)

}

执行此代码将返回"0 1 4 9 16 25 36 49 64 81",但这对我来说并不直观.

据我所知,当变量在堆栈上分配时,变量在超出范围时被解除分配.我也知道C++ STL向量存储指向变量的指针.为什么尽管整数在堆栈上被分配并超出范围,但向量仍保持有效整数?由于整数被解除分配,矢量保持的指针不应该被取消吗?

qua*_*dev 6

我也知道C++ STL向量存储指向变量的指针.

不,标准容器存储.的std::vector具有指向值的动态分配的内部阵列(在你的情况,int).

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