我有一个关于删除对象和指向它们的问题。 第一次测试:
a test;
a* test_ptr;
test_ptr = &test;
test.aPrint();
test_ptr->aPrint();
delete(test_ptr);
test.aPrint();
我在构造函数中添加了printout,析构函数和函数aPrint打印文本“aPrint”(ob)。
constructor
aPrint
aPrint
destructor
aPrint
destructor
如何两次调用析构函数? 如何在删除后仍然使用对象测试?
- - - - - - - - 编辑
所以,如果我使用新的。然后我必须使用删除,否则我就会泄漏。
a* test_ptr;
test_ptr = new a;
test_ptr->aPrint();
delete(test_ptr);
这是因为这个例子使用的堆是第一个使用堆栈的例子吗?
答案 0 :(得分:1)
未使用new
分配对象,因此调用delete
是未定义的行为。只是让它超出范围,并自动调用析构函数(在你的例子中第二次调用)。
答案 1 :(得分:1)
由于您的对象在堆栈上,当此对象超出范围时,将调用其析构函数。
您正在删除一次,编译器会再次隐式调用析构函数。
这就是为什么析构函数被调用两次。
但是,此类程序的行为尚未定义,并且可以用于双重删除的任何副作用。