为什么在初始化和调整对象向量时调用析构函数?

use*_*422 6 c++ vector

在我的程序中发生了一些事情,我无法找到它是否应该发生.如果是的话,我不明白为什么......

这是代码:

#include <iostream>
#include <vector>

using namespace std;

class A{
  public:
    A();
    ~A();
};

A::A(){
  cout << "creating" << endl;
}

A::~A(){
  cout << "deleting" << endl;
}

int main(void){
  vector<vector<A > > vec;

  vec.resize(5);
  for(int i = 0; i < 5; ++i){
    vec[i].resize(5);
  }

  cout << "END" << endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

creating
deleting
creating
deleting
creating
deleting
creating
deleting
creating
deleting
END
deleting
deleting
[..more deleting here]
Run Code Online (Sandbox Code Playgroud)

我理解为什么在"END"消息之后调用析构函数,但之前,我没有.我认为当向量调整大小时,类的构造函数被调用,但为什么是析构函数?

Ste*_*sop 17

在C++ 03中vector<A>::resize()有一个默认参数,默认值A().这是暂时的,被摧毁了.向量的元素是从它构造的副本.

这在C++ 11中是"固定的",其中有两个重载resize.一个具有单个参数,并对任何其他元素进行值初始化.另一个有两个参数,并从提供的值中复制初始化每个附加元素.在C++ 11中,此程序具有以下行为:

creating
creating
creating
<repeated for a total of 25 "creating"s>
creating
creating
creating
END
deleting
deleting
deleting
<repeated for a total of 25 "deleting"s>
deleting
deleting
deleting
Run Code Online (Sandbox Code Playgroud)

在C++ 03中,如果一个实例的A构造非常昂贵而且值得最小化,那么你可以将它从5个无参数 - + 25个拷贝结构减少到1个无参数和25个拷贝 -这样的结构:

A default_value;
for (int i = 0; i < 5; ++i) {
   // same end result as vec[i].resize(5)
   if (vec[i].size() >= 5) {
       vec[i].erase(vec.begin() + 5, vec.end());
   } else while(vec[i].size() < 5) {
       vec[i].push_back(default_value);
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以稍微改写一下,显然对于您的示例代码,您不需要"if"情况.但是我没有太多机会说"别的时候",所以我接受了.