首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在初始化和调整对象向量大小时调用析构函数?

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

Stack Overflow用户
提问于 2013-01-17 02:11:59
回答 1查看 2.3K关注 0票数 6

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

代码如下:

代码语言:javascript
复制
#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;
}

下面是输出:

代码语言:javascript
复制
creating
deleting
creating
deleting
creating
deleting
creating
deleting
creating
deleting
END
deleting
deleting
[..more deleting here]

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

EN

回答 1

Stack Overflow用户

发布于 2013-01-17 02:14:21

在C++03中,vector<A>::resize()有一个默认参数,其默认值为A()。就是这个暂时的东西被破坏了。向量的元素是从它复制构造的。

这在C++11中是“固定的”,其中有两个resize重载。一个只有一个参数,值初始化任何额外的元素。另一个有两个参数,从提供的值复制初始化每个额外的元素。在C++11中,此程序具有以下行为:

代码语言:javascript
复制
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

在C++03中,如果一个A实例的构建成本非常高,以至于有必要将其数量最小化,那么您可以将其从5个无参数+ 25个复制构造减少到1个无参数和25个复制构造,如下所示:

代码语言:javascript
复制
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);
   }
}

您可能会以稍微不同的方式编写它,显然,对于您的示例代码,您不需要"if“大小写。但是我没有太多的机会说“其他时候”,所以我抓住了机会。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14364937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档