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

时间:2016-02-25 14:39:06

标签: c++

所以我在看这个问题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的析构函数,因为已经构造了基类。

没有内存泄漏?

我说错了吗?

3 个答案:

答案 0 :(得分:8)

你是对的;这个将起作用,因为:

  • 当执行XBase构造函数体时,delete已经构造,并且将调用它的析构函数。
  • 对空指针执行delete[]a完全有效,并且什么都不做。

因此,如果bcXBase的分配失败,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)

如果你担心内存分配失败,我会把它放在一个单独的方法中,比如BuildCreate。然后你可以让析构函数处理它(如果已经初始化)(但是在盲目地delete之前肯定检查指针。

另一种解决方案是智能指针,它不是为了适应这种情况而设计的,而是自动解除分配内容。