C++ 堆栈展开是否取消分配堆上分配的内存?

C++ 堆栈展开是否取消分配堆上分配的内存?,c++,exception,memory-management,memory-leaks,exception-handling,C++,Exception,Memory Management,Memory Leaks,Exception Handling,如果我有以下资料: try{ int* i = new int(5); //exception thrown here } catch(const exception& e){ //Do I need to delete the heap allocation here? } 在抛出异常之前不久进行堆分配,作为堆栈展开的一部分,堆内存会被回收吗?或者是否会出现内存泄漏,我将在catch()语句中处理此问题?否,在堆栈展开期间只调用析构函数,不会出现“手动释放”或

如果我有以下资料:

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

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

否,在堆栈展开期间只调用析构函数,不会出现“手动释放”或类似的情况。您的
int
将泄漏。为了避免此类问题,请使用RAII,例如,您可以使用
std::vector
而不是原始的C样式数组,或者在您的示例中使用
std::unique_pointer
。通常认为,避免“裸”的
new
s是一种良好的做法,并且只在
std::unique_pointer
std::vector
等资源处理程序的实现中使用它。您描述的问题是其中一个更大的原因。

否,在堆栈展开期间只调用析构函数,不会出现“手动释放”或类似的情况。您的
int
将泄漏。为了避免此类问题,请使用RAII,例如,您可以使用
std::vector
而不是原始的C样式数组,或者在您的示例中使用
std::unique_pointer
。通常认为,避免“裸”的
new
s是一种良好的做法,并且只在
std::unique_pointer
std::vector
等资源处理程序的实现中使用它。您描述的问题是其中一个更大的原因。

否,在堆栈展开期间只调用析构函数,不会出现“手动释放”或类似的情况。您的
int
将泄漏。为了避免此类问题,请使用RAII,例如,您可以使用
std::vector
而不是原始的C样式数组,或者在您的示例中使用
std::unique_pointer
。通常认为,避免“裸”的
new
s是一种良好的做法,并且只在
std::unique_pointer
std::vector
等资源处理程序的实现中使用它。您描述的问题是其中一个更大的原因。

否,在堆栈展开期间只调用析构函数,不会出现“手动释放”或类似的情况。您的
int
将泄漏。为了避免此类问题,请使用RAII,例如,您可以使用
std::vector
而不是原始的C样式数组,或者在您的示例中使用
std::unique_pointer
。通常认为,避免“裸”的
new
s是一种良好的做法,并且只在
std::unique_pointer
std::vector
等资源处理程序的实现中使用它。您描述的问题是其中一个更大的原因。

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

delete i;         
  system("PAUSE"); 
如果你能去这里就更好了。。

堆栈展开或自动停靠生成放弃对象,这意味着堆栈中没有任何引用。然后,GC将清除该放弃对象,并将内存还原回JAVA中的操作系统。 但是在C++中需要注意内存管理,在这种情况下它会泄漏内存,你必须显式处理。 这是我的观点:

delete i;         
  system("PAUSE"); 
如果你能去这里就更好了。。

堆栈展开或自动停靠生成放弃对象,这意味着堆栈中没有任何引用。然后,GC将清除该放弃对象,并将内存还原回JAVA中的操作系统。 但是在C++中需要注意内存管理,在这种情况下它会泄漏内存,你必须显式处理。 这是我的观点:

delete i;         
  system("PAUSE"); 
如果你能去这里就更好了。。

堆栈展开或自动停靠生成放弃对象,这意味着堆栈中没有任何引用。然后,GC将清除该放弃对象,并将内存还原回JAVA中的操作系统。 但是在C++中需要注意内存管理,在这种情况下它会泄漏内存,你必须显式处理。 这是我的观点:

delete i;         
  system("PAUSE"); 
如果你能去这里就更好了。。

您将出现内存泄漏。您需要删除
catch
子句中的内存。但是,如果您使其
唯一{newint(5)},那么实际上,内存将在堆栈展开期间通过
unique\u ptr
的析构函数释放。这是智能指针的要点。只要你说应该,比如正确使用RAII或添加手动步骤。Igor展示了一种处理RAII的方法。你会有内存泄漏。您需要删除
catch
子句中的内存。但是,如果您使其
唯一{newint(5)},那么实际上,内存将在堆栈展开期间通过
unique\u ptr
的析构函数释放。这是智能指针的要点。只要你说应该,比如正确使用RAII或添加手动步骤。Igor展示了一种处理RAII的方法。你会有内存泄漏。您需要删除
catch
子句中的内存。但是,如果您使其
唯一{newint(5)},那么实际上,内存将在堆栈展开期间通过
unique\u ptr
的析构函数释放。这是智能指针的要点。只要你说应该,比如正确使用RAII或添加手动步骤。Igor展示了一种处理RAII的方法。你会有内存泄漏。您需要删除
catch
子句中的内存。但是,如果您使其
唯一{newint(5)},那么实际上,内存将在堆栈展开期间通过
unique\u ptr
的析构函数释放。这是智能指针的要点。只要你说应该,比如正确使用RAII或添加手动步骤。Igor展示了一种使用RAII的方法。它可以被视为一个由1个元素组成的数组,它可以由