Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构造函数和异常 我正在读一些关于C++的注释,遇到了下面的问题:_C++ - Fatal编程技术网

构造函数和异常 我正在读一些关于C++的注释,遇到了下面的问题:

构造函数和异常 我正在读一些关于C++的注释,遇到了下面的问题:,c++,C++,问:构造函数能否引发异常?当构造函数失败时,如何处理错误 答:构造函数从不抛出错误 现在这个答案有点让我困惑,只是为了确保我去读到你总是可以从构造函数抛出异常。我只是想确定这样做是否会造成笔记中的拼写错误,并且我可能不会遗漏一些重要的内容。当然,它可以。即使是标准容器(例如std::vector)也会从构造函数中抛出std::bad_alloc。这是在说实话。如果他们谈论的是一般的构造函数,说明是错误的。CTOR确实可以正常抛出。也许这是在讨论一个保证非throw构造的特殊类 另一方面,强烈建议

问:构造函数能否引发异常?当构造函数失败时,如何处理错误

答:构造函数从不抛出错误


现在这个答案有点让我困惑,只是为了确保我去读到你总是可以从构造函数抛出异常。我只是想确定这样做是否会造成笔记中的拼写错误,并且我可能不会遗漏一些重要的内容。

当然,它可以。即使是标准容器(例如
std::vector
)也会从构造函数中抛出
std::bad_alloc
。这是在说实话。

如果他们谈论的是一般的构造函数,说明是错误的。CTOR确实可以正常抛出。也许这是在讨论一个保证非throw构造的特殊类


另一方面,强烈建议您编写代码,这样您的析构函数就不会抛出。他们这样做是合法的,但在堆栈展开期间引发异常会导致程序立即终止(调用
std::terminate
)。

您可以从构造函数引发异常,但要小心:如果对象构造不正确,将不会调用析构函数

class Foo
{
public:
    Foo(int i)
    {
        throw i;
    }

    ~Foo()
    {
        std::cout << "~Foo()" << std::endl;
    }
};

int main()
{
    try
    {
        Foo f(42);
    }
    catch(...)
    {
        std::cout << "Catched" << std::endl;
    }

    return 0;
}
要解决此问题,应将一个构造函数封装到另一个构造函数中:

Foo()
{

}

Foo(int i): Foo()
{
    throw i;
}
输出:

Catched
~Foo()
Catched

鉴于
new
可以抛出,我认为您的“A”是错误的。也许它意味着“构造函数无法返回错误,因此通知构造错误的惯用方法是抛出异常”…您链接到了与OP相同的常见问题解答:@DavidO LOL,我显然需要重新表述答案:)尽管析构函数没有执行,但在第一个示例中没有内存泄漏。(与valgrind一起观察)如果没有(重新)抛出,就永远不会有catch all子句,否则你会过得很糟糕。@stefan,即使valgrind没有显示内存泄漏,在第一种情况下内存也会泄漏。