所以我在看这个问题Memory Allocation Exception in Constructor,我的老板在他的漂亮答案中说明析构函数不会被调用。
这让我想知道,
如果我要写
struct XBase
{
int* a;
char* b;
float* c;
XBase() : a(nullptr), b(nullptr), c(nullptr) {}
~XBase()
{
delete[] a; delete[] b; delete[] c;
}
};
和
struct X : XBase
{
X() {
a = new int[100];
b = new char[100];
c = new float[100];
}
}
然后,如果c
的分配失败(抛出异常),则会调用XBase
的析构函数,因为已经构造了基类。
没有内存泄漏?
我说错了吗?
答案 0 :(得分:8)
XBase
构造函数体时,delete
已经构造,并且将调用它的析构函数。delete[]
或a
完全有效,并且什么都不做。因此,如果b
,c
或XBase
的分配失败,std::vector
的析构函数将解除所有内容。
但是,很明显,这种设计可以让您编写更多需要的代码,因为您只需使用std::unique_ptr<T[]>
或 import IRootElementService = angular.IRootElementService;
import IAttributes = angular.IAttributes;
angular.module('app').component('book', {
/*@ngInject*/
templateUrl($element:IRootElementService, $attrs:IAttributes) {
// access to the $element or $attrs injectables
}
});
。
答案 1 :(得分:0)
只是要在这里提供正式版本来备份声明,
§15.2/ 2
任何存储持续时间的对象,其初始化或销毁由异常终止,将为其所有完全构造的子对象执行析构函数。
答案 2 :(得分:-1)
如果你担心内存分配失败,我会把它放在一个单独的方法中,比如Build
或Create
。然后你可以让析构函数处理它(如果已经初始化)(但是在盲目地delete
之前肯定检查指针。
另一种解决方案是智能指针,它不是为了适应这种情况而设计的,而是自动解除分配内容。