c++ - 异常对象生命周期

标签 c++ exception object lifetime

我想知道异常对象是如何创建的?为什么处理函数参数可以是非常量引用?

例如:

class E{
    public:
    const  char * error;
    E(const char* arg):error(arg){
    cout << "Constructor of E(): ";}

    E(const E& m){
        cout << "Copy constructor E(E& m): " ;
       error=m.error;
    }
};



int main(){
try{
    throw E("Out of memory");

}
catch(E& e){cout << e.error;}

}

输出: E() 的构造函数:内存不足

所以我有 throw E("out of memory")E("out of memory") 只是一个临时对象,除了E("out of memory") 因为没有调用复制构造函数。所以即使这个 E("out of memory") 只是一个临时对象,我有一个接受非常量引用的处理程序。

你能给我解释一下为什么这是可能的吗?

最佳答案

want to know how the exception object is created ?

当你这样做时:

throw E("Out of memory");

您在本地创建一个对象(类型 E)。抛出过程将此对象复制到标准未定义的某个私有(private)内存位置。因此被抛出的对象必须是可复制的。

注意:允许编译器优化拷贝并直接在私有(private)位置创建它。所以它没有被复制的事实是因为编译器优化了拷贝(所以它不再是本地的)。尝试将复制构造函数设为私有(private),现在它将无法编译。

and why the handler function parameter can be a non-const reference ?

当你捕获物体时:

catch(E& e)

您正在获取对象复制到的私有(private)位置的引用。它不是常量(或临时)值,因此您可以正常引用它。

关于c++ - 异常对象生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12999448/

相关文章:

c++ - 使用 sstream 遍历字符串

C++ 调用嵌套模板类析构函数

php - PHP 中的异常 - Try/Catch 或 set_exception_handler?

java - 关于try/catch语句的简单问题

javascript - javascript 对象的多个实例,无需覆盖配置选项

javascript - html 响应数据 ID 无法在 facebook API 调用中用作字符串

c++ - 具有相似索引的值的总和

c++ - 在 C++ 中,为什么无法初始化指向函数的指针?

java - 将异常日志保存到文件中

Javascript 日期对象与隐藏值的比较