构造函数/析构函数计数不匹配
mismatch in constructors/destructors count
可能重复:
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应该避免第二次拷贝;所有优化都启用了吗?据推测,它在b
的A
部分上调用一个复制构造函数来创建参数(即对其进行切片(,然后再次将该对象复制到堆栈上进行函数调用。(在第一个示例中,A
的构造函数没有被调用,因为生成的副本构造函数不打印输出。(当您提供副本构造函数时,它必须直接在堆栈上创建副本。
您没有计算所有的构造函数。在第一种情况下,在调用Func
时调用复制构造函数来创建对象的副本(因为函数按值获取参数(。
当您自己没有定义复制构造函数时,编译器会为您生成一个。编译器生成的复制构造函数不会打印出任何内容,因此它不会出现在您的输出中。
如果我理解正确,你实际上是在问这个问题:
为什么VS2010在我没有副本的情况下创建附加临时构造函数?
我唯一的答案是"因为这是允许的"。当您使用gcc时,它似乎会得到优化,当您提供用户定义的副本构造函数时,它也会得到优化。
这种行为有点奇怪,但完全符合要求。如果所有C++编译器都执行相同,我们只需要一个编译器。。。
相关文章:
- 为什么这里不调用析构函数
- 为什么在运算符删除中不调用析构函数?
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 单例:为什么不需要删除并且看不到析构函数调试消息
- 为什么移动运算符不只是析构函数+移动构造函数
- 我不明白析构函数有什么问题?
- 从 std::streambif 继承时不兼容析构函数编译器警告
- 可观察行为和未定义行为 -- 如果我不调用析构函数会发生什么?
- 为什么C++ std::list::clear() 不调用析构函数
- c++中的Guard,在main中未处理异常时不调用析构函数
- 删除类数组而不调用析构函数
- 移动构造函数不调用析构函数
- 删除 void 指针时不调用析构函数
- 为什么在删除析构函数时调用析构函数,如果未删除则不调用析构函数?
- 在构造函数中引发异常时不调用析构函数
- 为什么在数组创建期间抛出未捕获的异常时不调用析构函数C++?
- C++:为什么它不调用析构函数?
- 在不调用析构函数的情况下结束STL容器的生存期
- 为什么在 main 中未捕获异常时不调用析构函数?
- c# /CLI:如果在其中使用Dispose(),则不调用析构函数