使用对象指针销毁对象

3
如果一个对象存在如下所示:
MyClass obj;

调用成员函数的方法如下:
obj.myMemberFunction();

然后,在该对象完成其任务后调用其析构函数:

delete obj;

然而,假设我有一个对象的指针:

MyClass* obj;

调用成员函数:

obj->myMemberFunction();

现在...我该如何调用这个对象的析构函数?


一样的。您不需要删除在堆栈上创建的对象。 - Ruu
你不应该调用以MyClass obj;实例化的对象的析构函数 - 它是作为自动变量分配的,当退出作用域时,析构函数会自动被调用。 - SomeWittyUsername
4个回答

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;

值得注意的是:除非你真的需要使用指针,否则最好避免使用它们。在大多数情况下,请使用普通对象,以便它们能够被正确销毁。 - Martin York

2
如果你使用以下方式创建:
MyClass obj;

您不需要做任何事情来删除它。如果您使用的是 HTML,只需将该元素从代码中删除即可。
MyClass* obj = new MyClass();

你使用
delete obj;

删除它。


2

operator delete 用于释放通过对应的 operator new 在堆上分配的内存空间所得到的指针。

void function () 
{
  int * pt;

  pt = new int;

  *pt = 42;

  delete pt; // memory released
}

在堆栈上分配的内存会在相应作用域结束时自动释放:

void function () 
{
  int i;

  i = 42;

} // memory released

0
当你写下MyClass obj;时,对象被分配在栈上,而不是堆上。在这种情况下,对象在超出作用域时会自动销毁。编译器生成代码以确保调用析构函数。因此,您不需要显式删除对象。 delete用于在堆上分配对象的情况。例如:
MyClass* pobj = new MyClass;
// Do something with pobj...
delete pobj;

严格来说,就C++语言而言,物理存储位置并不相关,但是存储_期限_却是相关的。也就是“自动存储”/“动态存储”与这里的“栈”/“堆”。还有delete运算符的操作数类型。 - Lightness Races in Orbit
@Dabbler,s/MyClass pobj/MyClass *pobj/ - Ruu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接