如果 C++ 程序发生错误,如何删除动态分配的对象?

Posted

技术标签:

【中文标题】如果 C++ 程序发生错误,如何删除动态分配的对象?【英文标题】:How a dynamically allocated object is deleted if an error occur in the program in C++? 【发布时间】:2020-07-19 10:31:36 【问题描述】:

我想知道如果程序中发生错误,如何删除动态分配的对象。想象一下这个:

int main() 
  int *ptr = new int();

  int result = 15 / 0;

  delete ptr;

被0除是完全不可能的,所以与ptr关联的int永远不会被删除?

【问题讨论】:

这是***.com/questions/12875177/…的副本 这能回答你的问题吗? are pointers released from memory when c++ program end? 请注意,在这种情况下,除以零是有效操作,不会导致程序退出。见***.com/questions/4745311/c-division-by-0。所以delete ptr; 确实会被调用。 @HKrishnan 整数除以零会导致未定义的行为,您链接到的问题是关于浮点除法 (顺便说一句,浮点除以 0 也会导致未定义的行为,编译器可能会或可能不会通过执行 IEEE 行为来体现) 【参考方案1】:

如果C++程序出错,如何删除动态分配的对象?

没有被删除。

因为指针值会丢失,所以它永远不能被删除。这称为内存泄漏。

被0除是完全不可能的,所以与ptr关联的int永远不会被删除?

请注意,除以零的行为是不确定的。因此不能保证一定会出错。


如果一个程序异常终止,那么就会有一些内存没有被释放。这个泄漏很好,因为程序正在终止。操作系统将恢复为进程保留的所有内存。

更多问题的情况是异常,可能会被捕获,程序可能会继续执行。为了使程序具有异常安全性,您不能执行在持有拥有裸指针时可能会抛出的操作。事实上,您应该尽可能避免拥有裸指针。相反,请使用 RAII 容器和智能指针。

【讨论】:

【参考方案2】:

您应该使用允许释放的“智能指针”,即使在调用之前抛出异常也是如此。

unique_ptr<int> ptr(new int());

智能指针包含原始指针并允许删除它。

这是文档: https://docs.microsoft.com/fr-fr/cpp/cpp/smart-pointers-modern-cpp?view=vs-2019

【讨论】:

确实应该使用智能指针,但是这个程序有未定义的行为那么任何事情都可能发生(包括不执行析构函数)

以上是关于如果 C++ 程序发生错误,如何删除动态分配的对象?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 循环中正确删除动态分配的对象的位置

内存堆问题 C++,动态分配多维数组

c++ dynamic的问题

动态内存管理2

优化动态分配内存的变量

在 C++ 中动态调整数组的大小