构造函数/析构函数中的不匹配计数

时间:2011-09-30 08:28:44

标签: c++ visual-studio gcc

  

可能重复:
  C++ basic constructors/vectors problem (1 constructor, 2 destructors)

我有代码:

#include <iostream>
class A   
{    
public:    
    A() { std::cout<<"A::A"<<std::endl; }    
    ~A() { std::cout<<"A::~A"<<std::endl; }
};

class B : public A
{
public:
    B(){ std::cout<<"B::B"<<std::endl; }
    ~B(){ std::cout<<"B::B"<<std::endl; }
};

void Func( A a ){}

int main()
{
    B b;
    Func(b);
}
VS2010EE输出中的

将是:

A::A
B::B
A::~A //why twice? Once on gcc!
A::~A
B::~B
A::~A

但是,当我们有复制构造函数时,输出是:

A::A
B::B
A::A(copy)
A::~A
B::~B
A::~A

3 个答案:

答案 0 :(得分:0)

这有点不幸。 VS应该避免第二次复制;都是优化吗?据推测,它在A的{​​{1}}部分调用复制构造函数来创建参数(即切片),然后再将该对象复制到堆栈中以进行函数调用。 (在第一个示例中,未调用b的构造函数,因为生成的复制构造函数不打印输出。)当您提供复制构造函数时,它必须直接在堆栈上创建副本。

答案 1 :(得分:0)

你没有计算所有的构造函数。在第一种情况下,调用复制构造函数以在调用Func时创建对象的副本(因为该函数按值获取其参数)。

如果您自己没有定义复制构造函数,编译器将为您生成一个。并且编译器生成的复制构造函数不会打印任何内容,因此它不会在输出中显示。

答案 2 :(得分:0)

如果我理解正确,你实际上是在问这个:

  

为什么VS2010在没有副本时会创建附加临时文件   构造

我唯一的答案是'因为它被允许'。当您使用gcc时,它似乎会被优化掉,并且当您提供用户定义的复制构造函数时,它也会被优化掉。

这种行为有点奇怪,但它完全符合要求。如果所有C ++编译器都执行相同的操作,那么我们只需要一个编译器......