【问题标题】:Does stack-unwinding deallocate memory allocated on heap?堆栈展开是否会释放堆上分配的内存?
【发布时间】:2014-10-03 16:49:58
【问题描述】:

如果我有以下情况:

try{
    int* i = new int(5);
    //exception thrown here
}
catch(const exception& e){
    //Do I need to delete the heap allocation here?
}

在抛出异常之前不久进行堆分配,作为堆栈展开的一部分,堆内存会被回收吗?还是会出现内存泄漏,我应该在catch() 语句中处理这个问题?

【问题讨论】:

  • 你会有内存泄漏。你需要删除catch子句中的内存。
  • 然而,如果你把它设为unique_ptr<int> i{new int(5)};,那么实际上内存将在堆栈展开期间被unique_ptr 的析构函数释放。这就是智能指针的要点。
  • 只有当你说应该的时候,比如正确使用 RAII 或添加手动步骤。 Igor 展示了一种使用 RAII 的方法。

标签: c++ exception memory-management memory-leaks exception-handling


【解决方案1】:

不,在堆栈展开期间只会调用析构函数,不会有“手动释放”或类似的东西。你int 会泄露。为避免此类问题,请使用 RAII,例如,您可以使用 std::vector<int> 而不是原始 C 样式数组或 std::unique_pointer 作为示例。通常认为避免“裸”news 并仅在资源处理程序(如std::vectorstd::unique_pointer)的实现中使用它是一种很好的做法。您描述的问题是造成这种情况的更大原因之一。

【讨论】:

    【解决方案2】:

    堆栈展开或自动停靠产生放弃对象,意味着堆栈中没有任何引用。然后该放弃对象将被GC清理并在JAVA中将内存恢复到OS。 但是在 C++ 中需要注意内存管理,在这种情况下它会泄漏内存,您必须明确处理。
    这是我的观点:

    delete i;         
      system("PAUSE"); 
    

    如果你能去这里就更好了.. C ++ common memory leak problem

    【讨论】:

    • “你可以试试这个int a = new int[5];”是什么意思?即使我们假设您的意思是int *a,这也会造成更大的内存泄漏。
    • 嗨@jogojapan,实际上我只需要输入 (int *a) 。这就是为什么我提供该链接以获得一些帮助。
    猜你喜欢
    • 2021-08-30
    • 2011-05-23
    • 1970-01-01
    • 2016-07-25
    • 2020-09-02
    • 2013-02-28
    • 2021-03-20
    • 2015-09-11
    • 2011-05-28
    相关资源
    最近更新 更多