假设我有一个指向动态分配的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析构者抛出时会发生什么?
我有一个别人写的潜在不稳定的类,我不得不创建该类的对象数组.我提到该类是不稳定的,因此它可能偶尔会在默认构造函数中抛出异常.我无权访问源代码,只能访问已编译的二进制文件.
当我使用这些类型的对象分配动态数组时new,这些坏对象之一可能会抛出异常.它抛出一个自定义异常,而不是std::bad_alloc.无论如何,我需要让程序从异常中恢复并继续使用,尽管设置了一些错误标志,什么不是.我认为我应该delete与数组关联的内存,以防止内存泄漏.
我的理由是,如果类抛出在数组中间某处构造元素的异常,那么该元素将无法正确构造,并且所有未来元素将被异常停止构造,但之前的元素将是因为在抛出异常之前发生了这种情况.我想知道,是不是一个好主意,打电话delete的catch (...) { }?我该如何解决这个内存泄漏?
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)