gpt4 book ai didi

c++ - 析构函数中的 std::ios::exceptions 预期行为是什么?

转载 作者:行者123 更新时间:2023-11-30 01:52:58 27 4
gpt4 key购买 nike

考虑这个片段:

// Case 1: Explicitly calling close() does throw, as expected.
{
std::ifstream f;
f.exceptions ( std::ifstream::failbit | std::ifstream::badbit );
f.close(); // This will throw std::ifstream::failure, as close() on unopened file sets the failbit
}

// Case 2: close() will be called by destructor of object 'g', but does not throw.
{
std::ifstream g;
g.exceptions ( std::ifstream::failbit | std::ifstream::badbit );
} // Does not throw, even though "g's" destructor will call close() method

现在我确实明白了 C++ 中的析构函数永远不应该泄漏异常(这可能是案例 2 中观察到的行为的原因)。我的问题是:C++ 标准是否保证上述观察到的行为是这样的,或者它只是一个工件(如果是,C++03 和 C++11 在这方面有什么区别吗?任何相关引用C++ 标准将非常有帮助)。

另外,这种不在析构函数内部抛出的特殊情况通常是如何实现的,析构函数代码是否只是简单地捕获 close() 抛出的异常,并忽略它们?有人能指出我在任何主要编译器源代码中的实现吗。

最佳答案

virtual ~basic_filebuf();

27.9.1.2/5 Effects: Destroys an object of class basic_filebuf<charT,traits>. Calls close(). If an exception occurs during the destruction of the object, including the call to close(), the exception is caught but not rethrown (see 17.6.5.12).

强调我的。

关于c++ - 析构函数中的 std::ios::exceptions 预期行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23751099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com