繁体   English   中英

即使指针在函数堆栈中,我也必须删除它吗?

[英]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”确实消失了。

但是,指针与其指向的对象之间存在很大差异。

当指针对象被销毁时,指针所指向的内容什么也没有发生。 这里不仅有一个,而且还有两个对象:

  1. 指针。

  2. 它指向的是什么。

在这种情况下,指针指向使用new创建的动态范围内的对象。

该对象什么也不会发生,否则,您将泄漏内存。

因此,该对象需要delete d。

了解并充分理解这个概念之后,下一步就是打开C ++书籍,进入有关std::unique_ptrstd::shared_ptr类的章节,这将处理这些令人讨厌的细节,为了你。 您应该学习如何使用它们。 现代的C ++代码很少需要delete某些内容。 这些智能指针可以完成所有工作。

是。

在范围退出时(例如,当函数存在或块{...}完成时),在堆栈上创建的所有对象将被销毁,内存将被释放。

这适用于您的情况,即。 指针将被销毁,并且指针所占用的内存将被释放。 指针指向的对象将不会被清除。

当您处理多个流路径(if-else阶梯,许多return语句)和异常时,这是一个普遍的问题,也是一场噩梦。

为了解决这个问题,我们采用了两种主要策略:

  1. RAII
  2. 智能指针( std::unique_ptrboost::scoped_ptr ,旧版std::auto_ptr等)。

RAII-无需学术考虑-只是在堆栈上创建对象,如下所示:

{
   std::string s;
   fancy_object obj;
}

当我们退出他的作用域时, objs析构函数将被称为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM