相关疑难解决方法(0)

如果delete [] p失败会怎么样?

假设我有一个指向动态分配的10个元素数组的指针:

T* p = new T[10];
Run Code Online (Sandbox Code Playgroud)

后来,我想发布那个数组:

delete[] p;
Run Code Online (Sandbox Code Playgroud)

如果其中一个T析构函数抛出异常会发生什么?其他元素是否仍然被破坏?记忆会被释放吗?是否会传播异常,还是会终止程序执行?

同样地,当一个std::vector<T>被破坏而其中一个T析构者抛出时会发生什么?

c++ arrays memory-leaks exception resource-management

20
推荐指数
3
解决办法
1891
查看次数

如果分配该数组引发异常,你应该释放一个数组吗?

我有一个别人写的潜在不稳定的类,我不得不创建该类的对象数组.我提到该类是不稳定的,因此它可能偶尔会在默认构造函数中抛出异常.我无权访问源代码,只能访问已编译的二进制文件.

当我使用这些类型的对象分配动态数组时new,这些坏对象之一可能会抛出异常.它抛出一个自定义异常,而不是std::bad_alloc.无论如何,我需要让程序从异常中恢复并继续使用,尽管设置了一些错误标志,什么不是.我认为我应该delete与数组关联的内存,以防止内存泄漏.

我的理由是,如果类抛出在数组中间某处构造元素的异常,那么该元素将无法正确构造,并且所有未来元素将被异常停止构造,但之前的元素将是因为在抛出异常之前发生了这种情况.我想知道,是不是一个好主意,打电话deletecatch (...) { }?我该如何解决这个内存泄漏?

Badclass* array = nullptr;

try {
  array = new Badclass[10];  // May throw exceptions!
} catch (...) {
  delete[] array;
  array = nullptr;
  // set error flags
}
Run Code Online (Sandbox Code Playgroud)

这是我在内存中可视化的方式.它是否正确?

 array         0    1    2    3   4    5 6 7 8 9
 ___          __________________________________
| ---------->| :) | :) | :) | :) | :( | | | | | |
|___|        |____|____|____|____|____|_|_|_|_|_|
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling

17
推荐指数
2
解决办法
1717
查看次数