所以我在构造函数中查看了这个问题内存分配异常,我的老板在他的漂亮答案中说明析构函数不会被调用.
这让我想知道,
如果我要写
struct XBase
{
int* a;
char* b;
float* c;
XBase() : a(nullptr), b(nullptr), c(nullptr) {}
~XBase()
{
delete[] a; delete[] b; delete[] c;
}
};
Run Code Online (Sandbox Code Playgroud)
和
struct X : XBase
{
X() {
a = new int[100];
b = new char[100];
c = new float[100];
}
}
Run Code Online (Sandbox Code Playgroud)
然后,如果c失败的分配(抛出异常),那么XBase将调用析构函数,因为已经构造了基类.
没有内存泄漏?
我对么?
你是对的; 这将有效,因为:
X构造函数体执行时,XBase已经构造,并且将调用其析构函数.delete或者delete[]使用空指针是完全有效的,并且什么都不做.所以,如果分配a,b或者c失败,析构函数XBase会收回一切.
但是,显然,这种设计可以让你编写更多需要的代码,因为你可以简单地使用std::vector或std::unique_ptr<T[]>.