为什么析构函数被调用三次?

Mat*_*ian 5 c++ constructor destructor

输入:

#include <iostream>
using namespace std;
class SimpleClass
{
    public:

    SimpleClass()
    {
        cout<<"SimpleClass Constructor\n";
    }
    virtual ~SimpleClass()
    {
        cout<<"SimpleClass destructor\n";
    }
};
int main()
{
    SimpleClass a;    
    SimpleClass lol = a;

    SimpleClass b;
    SimpleClass * lol2 = &b;
}
Run Code Online (Sandbox Code Playgroud)

输出:

SimpleClass Constructor
SimpleClass Constructor
SimpleClass destructor
SimpleClass destructor
SimpleClass destructor
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么析构函数被调用3次.

构造函数只被调用两次!!!!

lol*_*ndo 11

析构函数被调用三次,a,lolb.
在你的情况下,ab使用default constructor.实例化.但是要注意lol使用的是实例化的copy constructor


Ale*_*ter 6

因为正好创建了3个SimpleClass类的对象,但是你的构造函数只被调用了2次:

  • 第一个对象是a,调用你的构造函数;
  • 第二是lol,它是由从复制初始化一个经由隐式定义的复制构造 (因而绕过你的构造);
  • 第三b,调用你的构造函数.

请注意,这lol2只是一个指向b的指针,因此不会进行额外的调用.

正确的名称是"析构函数",而不是"解构函数";)


lda*_*v1s 5

你有3个对象a,lolb.您没有跟踪由编译器生成的复制构造函数(此函数被调用 lol),因此这就是为什么只有两个构造函数.