如果对象存在:
MyClass obj;
调用成员函数:
obj.myMemberFunction();
然后在满足其目的后调用该对象的析构函数:
delete obj;
但是,假设我有一个指向对象的指针:
MyClass* obj;
调用成员函数:
obj->myMemberFunction();
现在......如何在此对象上调用析构函数?
答案 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 delete,operator 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;