构造函数中引发的异常

时间:2019-10-03 13:32:42

标签: c++

我试图了解构造函数引发异常时会发生什么问题。

例如,这段代码的一部分:

#include <iostream>

class X
{
public:
    X(int);
    ~X();
private:
    int* m;
};

X::X(int y)
{
    m = new int(y);
    throw std::exception();
}

X::~X()
{
    delete m;
    std::cout << "Destructor" << std::endl;
}

//---------------------------------------
int main()
{
    try
    {
        X a(4);
    }
    catch (const std::exception&)
    {
        std::cout << "ex" << std::endl;
    }
    system("pause");
    // output 
    /*  ex
        Press any key to continue . . .
    */
}

没有调用析构函数,因此是内存泄漏!

1)是否可以在不使用任何智能指针的情况下解决此问题?

2)我的主要问题是,当构造函数引发异常时(例如,当我们具有类的层次结构或可能引发异常的类成员时)会发生什么问题?

1 个答案:

答案 0 :(得分:0)

  

我的主要问题是构造函数抛出异常时会出现什么问题

就像一般的抛出一样,构造函数没有特定的细节。

C ++设计为在构造函数中抛出异常。

您的示例:

m = new int(y);
throw std::exception();

在任何地方都不好。

使用:

auto m = std::make_unique<int>(y);
throw std::exception();

相反。