在构造函数初始化列表中分配内存是否有任何问题?

Fir*_*gon 20 c++

我在我的C++程序中使用了很多初始化列表但是没有意识到你可以在其中分配内存.

所以你可以这样做(作为一个人为的例子):

class Test
{
private:
    int* i;
    int* j;
    int count;
    int* k;

public:
    Test(void) : i(new int), j(new int[10]), count(10), k(new int[count])
    {
    }

    ~Test(void)
    {
        delete i;
        delete [] j;
        delete [] k;
    }
};
Run Code Online (Sandbox Code Playgroud)

以这种方式进行内存分配是否有任何问题?关于初始化的顺序,在同一列表中初始化的参数初始化参数是否安全?即我count在使用它之前分配它是否安全使用或是否有一些特殊的初始化顺序我可能会犯规?

Ste*_*sop 24

这不是例外 - 安全.如果newfor j抛出异常,Test则不会调用析构函数for ,因此i不会释放内存for .

i如果j抛出的初始化程序,则调用析构函数,它只是一个原始指针没有析构函数.因此,您可以通过替换i合适的智能指针使其异常安全.在这种情况下,unique_ptr<int>for iunique_ptr<int[]>for j会这样做.

您可以依赖初始化程序以正确的顺序执行(定义成员的顺序,不一定是列表中的顺序).他们可以安全地使用已经初始化的数据成员,因此count在初始化器中使用没有问题k.

  • @Firedragon:使异常安全的最简单方法是使用智能指针而不是原始指针; 这也意味着您不需要编写析构函数,或者类中缺少的复制构造函数和复制赋值运算符.添加异常处理程序是相当丑陋的,并且有点繁琐,以便正确. (2认同)

NPE*_*NPE 6

在初始化程序抛出异常的情况下,此代码可能会泄漏内存。

请注意,如果的成员Test是聪明的指针(而不是原始指针),则可以使其正常工作。