jbo*_*ond 2 c++ pointers destructor
我是 C++ 新手,我有一个问题。
假设您x使用以下代码声明了该变量:
MyClass *x = new MyClass();
Run Code Online (Sandbox Code Playgroud)
使用这个变量后,我不再需要它了。
在以下提议中,首选的行动方案是什么?有什么区别?
称呼free(x);
称呼x->~MyClass();
称呼MyClass::~MyClass(p);
称呼delete x;
有人可以帮助我理解这一点吗?
提前致谢。
如果您通过以下方式创建实例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则将调用 的析构函数!
| 归档时间: |
|
| 查看次数: |
4059 次 |
| 最近记录: |