构造函数中的内存分配异常

时间:2016-02-25 14:13:28

标签: c++ memory-management

我有一个构造函数,它使用new运算符分配几个内存块。

X::X() {
    a = new int[100];
    b = new char[100];
    c = new float[100];
}

我的问题是,如果c的分配失败,并且构造函数抛出异常,是否会自动释放ab的内存?

4 个答案:

答案 0 :(得分:14)

自动释放ab的内存。必须使用new[]明确平衡每个delete[]

即使您的析构函数执行了删除(假设abc是类成员),那么您仍然会泄漏内存。那是因为在这种情况下析构函数不会被调用,因为对象无法构造。

使用std::vector可以避免这些问题。

答案 1 :(得分:9)

abc都将被销毁。根据它们的类型,可能会也可能不会释放内存。如果它们是指针,则它们的析构函数不会执行任何操作,并且内存会泄漏。如果它们是某种智能指针,大概是它们的析构函数会释放内存。

答案 2 :(得分:3)

不,他们不会。这就是为什么你需要了解RAII,特别是容器和智能指针。

在您的情况下,您可以使用std::vector<T>代替new T[100]

答案 3 :(得分:1)

变量a和b将自动销毁。在您的情况下,您必须使用此 std :: vector 。这是因为每当我们使用new []运算符时,我们需要明确定义delete []。