在C ++构造函数中分配内存的正确方法是什么?

时间:2010-08-12 09:31:00

标签: c++ memory constructor new-operator

在C ++构造函数中通过new分配内存的正确方法。参数列表中的第一种方式:

class Boda {
    int *memory;
    public:
        Boda(int length) : memory(new int [length]) {}
        ~Boda() { delete [] memory; }
};

或在构造函数体中:

class Boda {
    int *memory;
    public:
        Boda(int length) {
            memory = new int [length];
        }
        ~Boda() { delete [] memory; }
};

谢谢,Boda Cydo。

6 个答案:

答案 0 :(得分:3)

我认为最简单的方法是使用boost scoped array并让其他人经过良好测试的库代码为您处理。

所以:

class Boda {
    boost::scoped_array<int> memory;
    public:
        Boda(int length) : memory(new int [length]) {}
       ~Boda() {}
};

此外,无法复制范围数组 - 因此您可以避免在另一个答案中提到的令人讨厌的复制构造函数释放问题。

答案 1 :(得分:2)

答案 2 :(得分:2)

您应该使用将为您处理它的资源管理类。否则,除了不必要地复制现有逻辑和维护复制/赋值操作符之外,您还会遇到异常安全方面的一些严重问题。

答案 3 :(得分:1)

我想说两者在它们产生的效果上是等价的,两者都是“正确的方法”。 我更喜欢初始化列表但我会选择第二个变量,以便在尝试分配内存之前能够测试无效长度参数。

答案 4 :(得分:0)

memory成员变量是一个指针,如果你在初始化列表中分配它并且它失败了,你的类没有初始化,你不需要以后释放它(感谢CII用于类初始化的RAII设计模式)。如果在构造函数体内分配其内存,则会发生类似的行为。

但是如果你想处理某些事情,那么在构造函数的主体中分配它的内存。检查一下或尝试/捕获它或打印一些有用的消息,但至少,你必须抛出另一个异常,因为你的类初始化被破坏了。

我认为构造函数体中的memory分配比另一个更可读。

答案 5 :(得分:-1)

如果你想捕获内存分配错误(你可能应该这样做),那么你将不得不在构造函数体内调用new。