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

C++ 为什么在初始化和调整对象向量大小时调用析构函数?,c++,vector,C++,Vector,我的程序中发生了一些事情,我无法确定它是否应该发生。如果是的话,我不明白为什么 代码如下: #include <iostream> #include <vector> using namespace std; class A{ public: A(); ~A(); }; A::A(){ cout << "creating" << endl; } A::~A(){ cout << "deleting"

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

代码如下:

#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;
}
我理解为什么在“END”消息之后调用析构函数,但在“END”消息之前,我不理解。我认为当向量调整大小时,会调用类的构造函数,但是为什么要调用析构函数呢?

在C++03
vector::resize()
中有一个默认参数,默认值为
a()
。这是暂时的,被摧毁了。向量的元素是从它复制构造的

这在C++11中是“固定”的,其中有两个重载
resize
。其中一个只有一个参数,value初始化任何其他元素。另一个有两个参数,copy根据提供的值初始化每个附加元素。在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

您可能会编写稍微不同的代码,显然,对于示例代码,您不需要“if”的情况。但是我没有太多机会说“else while”,所以我接受了它。

您忘记了用户定义复制ctor。如果执行(使用输出)并在每次调用resize()后放置一个输出,您将看到发生了什么。值得一提的是,这段代码在C++11中的行为完全不同。@Csq:是的,我远远领先于您。对于“方式”等于“勉强”的价值观。我只是在发布之前检查一下标准:-)好的。。所以没有C++11就无法修复它?谢谢:)@bames53:“修复”是我的话,所以我想我应该捍卫它而不是用户1729422。错误的是,在C++03中,创建了5个(在C++11标准委员会看来)不必要的
A
实例。
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
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);
   }
}