![](/img/trans.png)
[英]If I use a pointer in a function to populate a list, do I have to delete that pointer at the end of the function in c++?
[英]Do I have to delete pointer even if it is in function stack?
总是删除指针,即使它只是在函数调用堆栈中? 函数栈释放时它不消失了吗?
// just Simple class
class CSimple{
int a;
}
// just simple function having pointer.
void simpleFunc(){
CSimple* cSimple = new CSimple();
cSimple->a = 10;
//.. do sth
delete cSimple; // <<< Always, do I have to delete 'cSimple' to prevent the leak of memory?
}
void main(){
for( int =0 ; i< 10 ; i++){
simpleFunc();
}
}
函数堆栈何时释放?
当函数返回时,“ CSimple * csimple”确实消失了。
但是,指针与其指向的对象之间存在很大差异。
当指针对象被销毁时,指针所指向的内容什么也没有发生。 这里不仅有一个,而且还有两个对象:
指针。
它指向的是什么。
在这种情况下,指针指向使用new
创建的动态范围内的对象。
该对象什么也不会发生,否则,您将泄漏内存。
因此,该对象需要delete
d。
了解并充分理解这个概念之后,下一步就是打开C ++书籍,进入有关std::unique_ptr
和std::shared_ptr
类的章节,这将处理这些令人讨厌的细节,为了你。 您应该学习如何使用它们。 现代的C ++代码很少需要delete
某些内容。 这些智能指针可以完成所有工作。
是。
在范围退出时(例如,当函数存在或块{...}完成时),在堆栈上创建的所有对象将被销毁,内存将被释放。
这适用于您的情况,即。 指针将被销毁,并且指针所占用的内存将被释放。 指针指向的对象将不会被清除。
当您处理多个流路径(if-else阶梯,许多return语句)和异常时,这是一个普遍的问题,也是一场噩梦。
为了解决这个问题,我们采用了两种主要策略:
std::unique_ptr
, boost::scoped_ptr
,旧版std::auto_ptr
等)。 RAII-无需学术考虑-只是在堆栈上创建对象,如下所示:
{
std::string s;
fancy_object obj;
}
当我们退出他的作用域时, obj
和s
析构函数将被称为duing stack unwinding。 编译器会确保所有流路都如此,并会为我们保持正确的释放顺序。
如果需要在堆上分配内存,请使用new
,请使用智能指针。
int foo()
{
std::unique_ptr<Object> o(new Object);
... some more code ...
if( something ) { return -1 }
... some more code ...
if( something_else ) { return -2 }
else { not yet }
return 0;
}
如您所见,我们可以使用3个“ exists”离开范围。 通常,在所有情况下都需要清除内存,这很容易导致人为错误。
无需在所有3种情况下手动清除对象,而是依靠自动析构函数调用堆栈上创建的对象。 编译器会解决。 当我们离开范围时,将调用std::unique_ptr
析构函数,并在Object
上调用delete
。
不要被聪明的笨蛋所宠爱。 它们不是“慢”,“膨胀”或其他废话。 智能Poiners的设计没有访问开销,从而增加了额外的安全性。
非常类似的技术用于锁。 查看std::lock_guard
类。
是的,您必须delete
所指向的数据。
指针本身在堆栈上,不需要删除。
但是,您可以将cSimple
存储在堆栈中,然后不必删除它:
void simpleFunc(){
CSimple cSimple; // no new
cSimple.a = 10; // "." instead of "->"
//.. do sth
// no deletion
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.