为什么调用析构函数
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
指向同一个地址也就不足为奇了。但是,取消引用此指针将产生未定义的行为。
这是一段代码,我一直在努力理解它是如何工作的。
#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
指向同一个地址也就不足为奇了。但是,取消引用此指针将产生未定义的行为。