在C++中通过指针捕获异常

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++编码标准书中解释得非常好.

请参阅C++编码标准:按值投掷,按引用捕获.

  • 如果你抛出的原因是因为你的内存不足,那么试图分配一个新对象就不会有所帮助. (14认同)
  • 根据是否可以分配A,你要么抛出指向A的指针,要么抛出std :: bad_alloc.所以至少你会扔东西...... (3认同)

oef*_*efe 16

Catch遵循正常的赋值兼容性规则,也就是说,如果抛出一个值,则可以将其作为值或引用捕获,而不是作为指针; 如果你抛出一个指针,你只能将它作为一个指针(或对指针的引用......)来捕获它.

但抛出指针并没有多大意义,它只会导致内存管理问题.因此,正如格雷戈里所解释的那样,你应该按照一般的规则,按引用来捕获.


Mar*_*som 5

Microsoft 的 MFC 使用按指针捕获,但我认为这是为了在正确实现 try 和 catch 之前与编译器兼容;最初他们使用 TRY 和 CATCH 宏来模拟它。每个异常都派生自CException,它有一个方法来判断对象是否需要被删除。

我不建议将其用于任何现代异常设计。通过引用捕获是要走的路。