在C ++中通过指针捕获exception

我发现有三种方法可以发现exception,有什么区别?

1)抓住价值;

2)参照;

3)抓住指针;

我只知道,通过值捕获将调用对象的两个副本,引用通过将调用一个。 那么如何通过指针捕捉? 何时使用指针捕获? 除了抛出一个对象之外,我可以抛出一个像这样的对象的指针吗?

class A {} void f() { A *p = new A(); throw p; } 

推荐的方法是投入价值,并通过参考

你的示例代码抛出一个指针,这是一个坏主意,因为你将不得不在catch站点pipe理内存。

如果你真的觉得你应该抛出一个指针,使用一个智能指针,如shared_ptr

不pipe怎么说,Herb Sutter和Alexei Alexandrescu解释了我在C ++编码标准中所做的解释。

请参阅C ++编码标准:按价值抛出,按引用抓住 。

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

但是抛出指针并没有什么意义,只会导致内存pipe理头痛。 因此,你应该遵循规则抛出的价值 ,按照格雷戈里的解释来引用

微软的MFC使用catch指针,但是我认为这是为了兼容编译器之前try和catch的正确实现; 最初他们使用TRY和CATCHmacros来模拟它。 每个exception都来自CException,它有一个确定对象是否需要删除的方法。

我不会推荐任何现代的exceptiondevise。 通过参考来捕捉是要走的路。

虽然基本上可以抛出任何types的对象,但是通过这样做可以获得很less(如果有的话)。 当一个对象需要有一个生命周期不适合自动分配 – 也就是说你希望它的生命周期独立于正常的程序范围时,dynamic分配是非常有用的。

但是,在一个exception对象的情况下,这并没有什么意义。 一个exception对象通常只在exception处理程序中使用,当你退出该exception的(最后一个)处理程序时,你显然希望它被销毁。

还有一个事实是,你通常希望保持exception处理代码非常简单。 举个例子,如果你试图报告免费的商店/堆被用尽或腐败,试图分配你的exception对象,用尽/腐败的免费商店/堆通常不会很好地工作…

通过指针捕获/抛出exception并不是一个好的scheme。 C ++的语义允许它,但它不是非常有用,因为大多数时候你会抛出一个临时的exception或string对象。

然而,一些库(Boost.Graph这样做,我相信)使用throw从深度recursion函数返回给调用者的返回值; 在这样的情况下,返回值可能是一个指针,所以抛出一个指针是有道理的。