C++中异常对象的范围是什么?一旦执行catch处理程序,它是否会超出范围?另外,如果我创建一个未命名的异常对象并抛出它,那么在捕获该异常时,如果我通过const引用或非const引用捕获它是否重要?
请考虑以下简单的C++代码:
void foo() {
throw(my_exception());
}
void check_exc(const my_exception &exc) {
/* Do stuff with exc */
}
void bar() {
try {
foo();
} catch(const my_exception &exc) {
check_exc(exc);
}
}
Run Code Online (Sandbox Code Playgroud)
在bar的异常处理程序中,引用的异常如何exc仍然存在,看看它是如何在foo堆栈帧中分配的?在异常处理程序运行时,该帧是否应该被解除,并且在那里分配的任何值都已经被认为是死的?特别是因为我明确地调用了另一个需要堆栈空间的函数.
作为一名试图学习C++的C程序员,我在这里误解了什么?这些不同的值实际上存在于内存中,更准确地说是什么?
我正在派生我自己的异常,调用它MyException,std::system_error从而重写what()以计算并返回我的消息.MyException的初始化列表不会调用带有消息的system_error构造函数覆盖.
如果我抓住一个MyException,并将其复制到std::exception调用的结果what()上std::exception就是nullptr.这是有道理的.
我的问题是,如果我确实使用了在初始化时接收消息的system_exception的构造函数MyException,是否指定system_error将获取消息的副本并拥有它并释放它?
我假设这将使std::exception副本MyException能够返回有效的what().虽然我会在每次MyExceptions创建新内容时计算"什么"需要考虑性能.只有在首次调用what()时,我才能懒惰地计算它.
我有点担心'what'字符串的所有权what()返回a char*而不是a const std::string&.
代码是这样的(我还没有编译):
class MyException : public std::system_error
{
std::string what_;
public:
MyException(int errorValue, const std::error_category& category)
: std::system_error(errorValue, category)
{}
char* what() const
{
what_ = "MyException: " + to_string(code().value());
return what_.c_str();
}
};
int main()
{
std::exception ex;
try
{ …Run Code Online (Sandbox Code Playgroud)