我在我的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 i和unique_ptr<int[]>for j会这样做.
您可以依赖初始化程序以正确的顺序执行(定义成员的顺序,不一定是列表中的顺序).他们可以安全地使用已经初始化的数据成员,因此count在初始化器中使用没有问题k.