为什么调用析构函数

Why is destructor invoked

这是一段代码,我一直在努力理解它是如何工作的。

#include <iostream>

using namespace std;

class A
{
public:
    int variable;

    A()
    {
        cout << "Default Constructor\n";
    }

    A(int variable_)
    {
        cout << "Overloaded Constructor\n";
        variable = variable_;
    }

    A(A& Object)
    {
        cout << "Copy Constructor\n";
        variable = Object.variable;
    }

    ~A()
    {
        cout << "Destructor\n";
    }
};

void main()
{
    {
        A* PA1 = new A(1);

        cout << "\n";

        A* PA2 = &(A(*(PA1)));

        cout << "Second\n\n";

        A* PA3 = &(A(1));

        cout << "\n";

        A* PA4 = new A(*(PA3));
    }



    cout << "\n";
    system("pause");
}

为什么在PA2初始化后调用析构函数?这是什么意思 - &(A(*(PA1))) and &(A(1))?

这是这段代码的输出:

因为它们是临时对象,当它们超出范围时就会被杀死。

&(A(*(PA1))) 表示A的一个对象的地址,它是用拷贝构造函数构造的,输入变量是PA1指向的。

&(A(1))表示A的一个对象的地址,是用拷贝构造函数构造的,输入变量为1。

在这两种情况下,这些对象都是临时的。

&(A(*(PA1))) 调用 A(*(PA1)) 和 return 指向变量的指针。因为这是一个构造函数,所以它 return 是一个 A 类型的变量,并且因为你向它传递一个类型 A 的变量,所以它调用复制构造函数。这不是好的代码,因为 return 在临时内存中。此行为未定义,因此在编写代码时切勿使用此行为。

&(A(1)) 和上面做同样的事情,但是调用带有 int 的构造函数,因为这是你传递给它的。

调用析构函数的原因是因为 C++ 自动销毁 unused/whose 作用域过期的变量。因此,当您在不使用 new 关键字的情况下调用构造函数时,会创建对象,但不会将其存储在任何地方;您存储它的地址,如上所述,这是未定义的行为。因此,由构造函数编辑的值 return(因此称为临时值)立即被销毁。

您的语句 A* PA3 = &(A(1)) 创建了一个临时对象,该对象将在语句之后立即销毁。因此,析构函数将在此时调用,即在语句之后。

似乎您在为 PA3 仍将指向(已销毁的)临时对象的地址这一事实而苦苦挣扎。

请注意,在 C++ 中,销毁对象不会 change/reset 指向该对象的任何指针。只是定义了通过这样的指针访问已删除的对象会调用未定义的行为。所以PA3和临时对象的this指向同一个地址也就不足为奇了。但是,取消引用此指针将产生未定义的行为。