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

mismatch in constructors/destructors count

本文关键字:不匹配 析构函数 构造函数      更新时间:2023-10-16

可能重复:
C++基本构造函数/向量问题(1个构造函数,2个析构函数(

我有代码:

#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

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

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

当您自己没有定义复制构造函数时,编译器会为您生成一个。编译器生成的复制构造函数不会打印出任何内容,因此它不会出现在您的输出中。

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

为什么VS2010在我没有副本的情况下创建附加临时构造函数?

我唯一的答案是"因为这是允许的"。当您使用gcc时,它似乎会得到优化,当您提供用户定义的副本构造函数时,它也会得到优化。

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