使用指向对象的指针进行破坏

时间:2012-11-03 17:13:22

标签: c++ pointers object destructor delete-operator

如果对象存在:

MyClass obj;

调用成员函数:

obj.myMemberFunction();

然后在满足其目的后调用该对象的析构函数:

delete obj;

但是,假设我有一个指向对象的指针:

MyClass* obj;

调用成员函数:

obj->myMemberFunction();

现在......如何在此对象上调用析构函数?

4 个答案:

答案 0 :(得分:6)

你已经倒退了;在第二种情况下执行delete,而执行第一种情况:

MyClass obj;
obj.myMemberFunction();
//delete obj;
//^^^^^^^^^^^
// NO! `obj` has automatic storage and will
// be destroyed automatically when it goes out
// of scope.

delete需要一个指向动态分配对象的指针:

MyClass* obj = new MyClass;
obj->myMemberFunction();
delete obj;

答案 1 :(得分:2)

如果您使用

创建它
MyClass obj;
你没有删除它。如果您使用

创建它
MyClass* obj = new MyClass();

你使用

delete obj;

删除它。

答案 2 :(得分:2)

由于相应的operator deleteoperator new旨在用于存储堆上分配区域地址的指针。

void function () 
{
  int * pt;

  pt = new int;

  *pt = 42;

  delete pt; // memory released
}

堆栈上分配的内存在相应范围的末尾自动释放:

void function () 
{
  int i;

  i = 42;

} // memory released

答案 3 :(得分:0)

当您编写MyClass obj;时,对象将在堆栈​​上分配,而不是在堆上。在这种情况下,对象会自动销毁,然后超出范围。编译器生成代码以确保调用析构函数。因此,您不要明确删除该对象。

在堆上分配对象时使用

delete。例如:

MyClass* pobj = new MyClass;
// Do something with pobj...
delete pobj;