0

我有一个关于删除对象和指向它们的指针的问题。第一次测试:

  a test;
  a* test_ptr;
  test_ptr = &test;
  test.aPrint();
  test_ptr->aPrint();
  delete(test_ptr);
  test.aPrint();

我在构造函数、析构函数和函数中添加了打印输出,aPrint 打印文本“aPrint”(ob)。

constructor
aPrint
aPrint
destructor
aPrint
destructor

如何两次调用析构函数?删除后如何仍然使用对象测试?

- - -编辑 - - -

所以如果我用 new 代替。然后我必须使用删除,否则我会泄漏。

a* test_ptr;
test_ptr = new a;
test_ptr->aPrint();
delete(test_ptr);

这是因为这个例子使用了堆,而第一个例子使用了栈吗?

4

2 回答 2

1

该对象不是使用分配new的,因此调用它是未定义的行为delete。只要让它超出范围,就会自动调用析构函数(您的示例中的第二次调用)。

于 2013-10-31T07:42:15.383 回答
1

由于您的对象在堆栈上,因此当该对象超出范围时将调用其析构函数。

您正在删除一次,而编译器正在另一次隐式调用析构函数。

这就是为什么析构函数被调用两次的原因。

但是,此类程序的行为未定义,并且已准备好应对双重删除的任何副作用。

于 2013-10-31T07:47:31.487 回答