使用基类作为指针的安全容器

P45*_*ent 11 c++

所以我在构造函数中查看了这个问题内存分配异常,我的老板在他的漂亮答案中说明析构函数不会被调用.

这让我想知道,

如果我要写

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将调用析构函数,因为已经构造了基类.

没有内存泄漏?

我对么?

lis*_*rus 8

你是对的; 这将有效,因为:

  • X构造函数体执行时,XBase已经构造,并且将调用其析构函数.
  • 执行delete或者delete[]使用空指针是完全有效的,并且什么都不做.

所以,如果分配a,b或者c失败,析构函数XBase会收回一切.

但是,显然,这种设计可以让你编写更多需要的代码,因为你可以简单地使用std::vectorstd::unique_ptr<T[]>.