sky*_*oor 48 c++ exception-handling try-catch throw
我发现有三种方法可以捕获异常,有什么区别?
1)按价值捕获;
2)引用参考;
3)用指针抓住;
我只知道按值捕获将调用该对象的两个副本,通过引用捕获将调用一个.那么指针捕获怎么样?什么时候用指针捕捉?除了抛出一个对象,我可以抛出一个像这样的对象的指针吗?
class A {}
void f() {
A *p = new A();
throw p;
}
Run Code Online (Sandbox Code Playgroud)
Gre*_*osz 79
推荐的方法是按值抛出并通过引用捕获.
您的示例代码抛出指针,这是一个坏主意,因为您必须在catch站点管理内存.
如果你真的觉得你应该抛出指针,请使用智能指针,如shared_ptr.
无论如何,Herb Sutter和Alexei Alexandrescu在他的C++编码标准书中解释得非常好.
oef*_*efe 16
Catch遵循正常的赋值兼容性规则,也就是说,如果抛出一个值,则可以将其作为值或引用捕获,而不是作为指针; 如果你抛出一个指针,你只能将它作为一个指针(或对指针的引用......)来捕获它.
但抛出指针并没有多大意义,它只会导致内存管理问题.因此,正如格雷戈里所解释的那样,你应该按照值一般的规则,按引用来捕获.
Microsoft 的 MFC 使用按指针捕获,但我认为这是为了在正确实现 try 和 catch 之前与编译器兼容;最初他们使用 TRY 和 CATCH 宏来模拟它。每个异常都派生自CException,它有一个方法来判断对象是否需要被删除。
我不建议将其用于任何现代异常设计。通过引用捕获是要走的路。