Ash*_*ain 5 c++ destructor exception temporary
请考虑以下代码:
std::string my_error_string = "Some error message";
// ...
throw std::runtime_error(std::string("Error: ") + my_error_string);
Run Code Online (Sandbox Code Playgroud)
传递给runtime_error的字符串是字符串返回的临时字符串operator+
.假设此异常的处理方式如下:
catch (const std::runtime_error& e)
{
std::cout << e.what() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
字符串的临时返回何时被operator+
销毁?语言规范有什么可说的吗?另外,假设runtime_error接受了一个const char*
参数,并抛出如下:
// Suppose runtime_error has the constructor runtime_error(const char* message)
throw std::runtime_error((std::string("Error: ") + my_error_string).c_str());
Run Code Online (Sandbox Code Playgroud)
现在什么时候运算符+返回的临时字符串被销毁?它会在catch块尝试打印之前被销毁,这就是为什么runtime_error接受std :: string而不是const char*?
小智 8
runtime_error是一个包含字符串的类.该字符串将由普通的C++构造和销毁机制为您管理.如果它包含char*,则必须显式管理,但您仍然不必作为runtime_error 的用户执行任何操作.
尽管你可能在互联网上的其他地方读到了什么,但C++的设计几乎总是做"合理的事情" - 你实际上必须非常努力地打破这种合理的行为,当然这并非不可能.
作为一个临时对象(12.2),它的结果+
将作为评估包含它的全表达式(1.9/9)的最后一步被销毁.在这种情况下,full-expression是throw-expression.
甲界外球表达构建体的临时对象(异常对象)(15.1)(std::runtime_error
在这种情况下).在构造了异常对象之后,throw-expression中的所有临时值都将被销毁.抛出表达式的评估完成后抛出异常,因为临时数据的破坏是此评估的一部分,它们将在自输入try块(15.2)之后和处理程序之前构建的自动变量销毁之前被销毁进入.
runtime_error
构造函数的后置条件是what()
返回一些strcmp
认为等于c_str()
传入的参数返回的内容.这是一个理论possiblility,一旦std::string
作为一个构造函数参数被破坏过,runtime_error
的what()
可以返回不同的东西,虽然这将是一个值得商榷的实现,它仍然必须是某种形式的空终止字符串,它不能返回指向c_str()
死字符串陈旧的指针.