如何正确删除C++中的指针?

jbo*_*ond 2 c++ pointers destructor

我是 C++ 新手,我有一个问题。

假设您x使用以下代码声明了该变量:

MyClass *x = new MyClass();
Run Code Online (Sandbox Code Playgroud)

使用这个变量后,我不再需要它了。

在以下提议中,首选的行动方案是什么?有什么区别?

  1. 称呼free(x);

  2. 称呼x->~MyClass();

  3. 称呼MyClass::~MyClass(p);

  4. 称呼delete x;

有人可以帮助我理解这一点吗?

提前致谢。

for*_*818 6

如果您通过以下方式创建实例new

MyClass *x = new MyClass();
Run Code Online (Sandbox Code Playgroud)

必须通过以下方式删除它delete

delete x;
Run Code Online (Sandbox Code Playgroud)

1.) 打电话free(x);

不。free它只释放内存,不调用析构函数。如果您malloc记得的话,您需要free它,但很少需要malloc在 C++ 中使用,并且调用free从 获得的指针new是错误的。

2.) 打电话x->~MyClass();

不。显式调用析构函数几乎总是错误的!

(例如,当您通过placement new 创建对象时,您不会直接调用析delete构函数,而是直接调用析构函数,因为placement new 在已分配的内存中创建对象。)

3.) 打电话MyClass::~MyClass(p);

不。这没有意义,析构函数不带参数。

4.) 打电话delete x;

是的。打电话delete...

销毁先前由 new 表达式分配的对象释放获得的内存区域

您不应该手动管理内存。要么依赖自动存储:

MyClass x;
Run Code Online (Sandbox Code Playgroud)

x当超出范围时,会自动调用 的析构函数。或者,如果您确实需要动态内存分配,请使用智能指针

进一步阅读:为什么 C++ 程序员应该尽量减少使用“new”? 顺便说一句,这是一个常见的误解,我记得 Stroustrup 的每次演讲都有一个用于new创建对象的示例,然后他解释说它绝对不应该使用new. 事实上,不仅仅是忘记打电话delete。考虑:

 { 
     MyClass *x = new MyClass();
     foo();   
     delete x;   // phew I didnt forget to call delete
 }
Run Code Online (Sandbox Code Playgroud)

如果foo抛出异常,那么这段代码就会泄漏内存。正确的方法是依赖RAII:

 { 
     MyClass x;
     foo();   
 }
Run Code Online (Sandbox Code Playgroud)

现在如果foo抛出异常,x则将调用 的析构函数!