在C++中,何时自动为本地向量调用析构函数

In C++, when is destructor called automatically for local vector?

本文关键字:向量 调用 析构函数 C++ 何时自      更新时间:2023-10-16

例如,假设我有以下代码:

vector<vector<int>> big;
for (int i=0;i<3;++i){
    vector<int> small;
    small.push_back(3*i+1);
    small.push_back(3*i+2);
    small.push_back(3*i+3);
    big.push_back(small);
}
for (vector<int> s:big){
    for (int a:s){cout<<a<<" ";}
    cout<<endl;
}

cout 给出的结果是 big 包含每个 for 循环中向量 small 的值,我很困惑,因为我认为向量 small 会在每个 for 循环中自动销毁。为什么大人物仍然可以获得正确的价值?

谢谢!

执行时:

big.push_back(small);

small的副本将添加到big 中。您可以通过执行以下操作来验证它们是两个不同的对象:

std::cout << (void*)&big.back() << std::endl;  // big.back() returns a reference to the copy.
std::cout << (void*)&small << std::endl;

您还可以验证它们是否独立保存向量的数据。您可以打印保存数据的指针。

std::cout << (void*)big.back().data() << std::endl;
std::cout << (void*)small.data() << std::endl;

这是因为您使用了制作小向量副本的big.push_back(small);,当小向量在循环结束时被破坏时,复制不受影响

std::vector<T>::push_back()是基于

复制的。它创建参数的副本,在本例中为 small ,并将其存储在 big 中。

所以你看到的不是small的元素,而是实际上big