我想在C ++中显式调用对象的析构函数来销毁该对象。
这只是一个试验编程语言功能的简单程序。我有一个默认构造函数,它将内部数据成员设置为1,重载构造函数将内部数据成员设置为参数,以及析构函数,它显示刚刚销毁的对象的内部数据成员。还有一个打印内部数据成员的函数。
#include <iostream>
using std::cout;
using std::endl;
class myClass {
public:
myClass()
{
i = 1;
cout << "default ";
cout << "constructor called with " << this->i << endl;
}
myClass(int i)
{
this->i = i;
cout << "constructor called with " << this->i << endl;
}
~myClass()
{
cout << "object " << i << " destroyed!" << endl;
}
void printData()
{
cout << "object's data is " << i << endl;
}
private:
int i; // private data member
};
int main() {
myClass a;
myClass b;
myClass c(8);
a.printData();
b.printData();
c.printData();
/* I want to explicitly destroy object b. */
b.~myClass();
b.printData();
/* all the destructors get called when the objects go out of scope */
return 0;
}
我的理由是这样的:我认为析构函数会导致对象被销毁,因此它不再存在于内存中。在我显式调用析构函数之后,我不再能够再次使用该对象,因为它已被销毁。但是,我能够调用对象的函数并打印内部数据成员的值。手动调用析构函数是否无法破坏对象?这里发生了什么? 输出:
default constructor called with 1
default constructor called with 1
constructor called with 8
object's data is 1
object's data is 1
object's data is 8
object 1 destroyed!
object's data is 1
object 8 destroyed!
object 1 destroyed!
object 1 destroyed!
调用析构函数会破坏对象,还是调用析构函数来破坏对象?
答案 0 :(得分:1)
在我显式调用析构函数之后,我再也不能再使用该对象了,因为它被销毁了
那是对的。只有它的C ++,而不是&#34;你不再能够&#34;就像在&#34;当你做坏事时你会受到警告&#34;它更像是&#34;你可能会在未来任何随机点被击中,而不会发出警告你做坏事&#34; (又名&#34;未定义的行为&#34;)。
在您的特定示例中,您销毁对象,并且它在逻辑上不再存在。内存可能仍然被分配或甚至包含一些旧数据。但是,尝试访问它是未定义的行为。它可能是一种工作&#34;关于编译器,编译器标志,源代码,操作系统和月相的特定组合,它可能在以后有所不同,技术上甚至可能wipe your hard drive。
此外,当您在局部变量中声明对象时,它会在超出范围时第二次自动销毁。这也是未定义的行为,但是您的程序行为已经完全未定义并不重要。
您可以尝试使用Valgrind,AddressSanitizer或UndefinedBehaviorSanitizer等动态分析来捕获这些内容,但它们不提供任何保证。