首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对复制构造函数和析构函数的无关调用

对复制构造函数和析构函数的无关调用
EN

Stack Overflow用户
提问于 2010-04-17 08:23:13
回答 1查看 408关注 0票数 2

[的后续行动]

代码语言:javascript
复制
class A
{
    public:
         A()          {cout<<"A Construction"     <<endl;}
         A(A const& a){cout<<"A Copy Construction"<<endl;}
        ~A()          {cout<<"A Destruction"      <<endl;}
};

int main() {
    {
        vector<A> t;
        t.push_back(A());
        t.push_back(A());   // once more
    }
}

产出如下:

代码语言:javascript
复制
A Construction        // 1
A Copy Construction   // 1
A Destruction         // 1
A Construction        // 2
A Copy Construction   // 2
A Copy Construction   // WHY THIS?
A Destruction         // 2
A Destruction         // deleting element from t
A Destruction         // deleting element from t
A Destruction         // WHY THIS?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-17 08:32:47

为了清楚地了解发生了什么,我建议在输出中包含this指针,以确定哪个A正在调用该方法。

代码语言:javascript
复制
     A()          {cout<<"A (" << this << ") Construction"     <<endl;}
     A(A const& a){cout<<"A (" << &a << "->" << this << ") Copy Construction"<<endl;}
    ~A()          {cout<<"A (" << this << ") Destruction"      <<endl;}

我得到的输出是

代码语言:javascript
复制
A (0xbffff8cf) Construction
A (0xbffff8cf->0x100160) Copy Construction
A (0xbffff8cf) Destruction
A (0xbffff8ce) Construction
A (0x100160->0x100170) Copy Construction
A (0xbffff8ce->0x100171) Copy Construction
A (0x100160) Destruction
A (0xbffff8ce) Destruction
A (0x100170) Destruction
A (0x100171) Destruction

因此,流可以解释为:

  1. 临时A (…)
  2. 临时A (…)cf)被复制到向量(…)中。60.临时A(
  3. ) (…)是destroyed.
  4. Another临时A (…)对created.
  5. The向量进行扩展,并对原A (…)进行扩展。在该向量中复制到新位置(…)70)
  6. The其他临时A (…)将ce复制到向量(…)中。
  7. 所有不必要的A (…)拷贝60,…现在destroyed.
  8. The向量被破坏了,所以A的(…)70,…71)内部也被摧毁。--

如果你这样做了,第5步就会消失。

代码语言:javascript
复制
    vector<A> t;
    t.reserve(2); // <-- reserve space for 2 items.
    t.push_back(A());
    t.push_back(A());

产出将成为:

代码语言:javascript
复制
A (0xbffff8cf) Construction
A (0xbffff8cf->0x100160) Copy Construction
A (0xbffff8cf) Destruction
A (0xbffff8ce) Construction
A (0xbffff8ce->0x100161) Copy Construction
A (0xbffff8ce) Destruction
A (0x100160) Destruction
A (0x100161) Destruction
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2657752

复制
相关文章

相似问题

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