异常对象寿命
Exception object lifetime
我想知道如何创建异常对象?以及为什么处理程序函数参数可以是非const参考?
例如:
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")
只是一个临时对象,我也有一个处理程序,可以进行非const参考。
你能向我解释为什么这是可能的吗?
想知道如何创建异常对象?
当您这样做时:
throw E("Out of memory");
您在本地创建一个对象(E类型)。抛出此对象的过程将此对象副本抄录到标准未定义的某些私有内存位置。因此,要扔的对象必须是可复制的。
注意:允许编译器优化副本并直接在私有位置创建。因此,未复制的事实是因为编译器优化了副本(因此它不再是局部)。尝试将复制构造函数私有化,现在它将无法编译。
为什么处理程序函数参数可以是非const参考?
当您捕获对象时:
catch(E& e)
您正在复制到私有位置的对象。它不是const(或临时)值,因此您可以正常参考它。
相关文章:
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 对象初始化后在C++中显示 char 数组时的异常行为
- 如何捕获 C++ 内置异常对象
- 对象接收堆栈溢出异常 c++ 的排序向量
- 堆异常 -1073741510对象
- std::bad_weak_ptr对象构造后shared_from_this异常
- 如何捕获源自静态分配对象的构造函数的异常?
- 基于对象的两个属性的自定义比较器会引发异常
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- 为什么内置类型的对象上的溢出会导致异常/未定义的行为?
- 如何防止构造函数在引发异常时创建对象
- std::system 实例化单一实例对象时的异常
- 异常对象的最后一个潜在销毁点
- 初始化引发异常的对象
- 调试器在异常C++时未挂起调试对象
- 通过引用派生类对象从基类对象执行向下转换时引发bad_cast异常
- 在 C++ 中的构造函数中引发异常时销毁对象的成员变量
- C++ 异常处理:将异常定义为对象
- 从函数中抛出内部对象异常合法吗