为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕的地10843 2019-10-28 15:02:55
我发现有三种捕获异常的方法,有什么区别?1)抓住价值;2)通过引用捕获;3)被指针抓住;我只知道按值捕获将调用该对象的两个副本,按引用捕获将调用一个对象。那么指针捕获又如何呢?何时使用指针捕获?除了抛出一个对象,我还能抛出一个指向这样的对象的指针吗?class A {}void f() {  A *p = new A();        throw p;}
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

推荐的方法是按值抛出并按引用捕获

您的示例代码将抛出一个指针,这是一个坏主意,因为您将不得不在捕获站点上管理内存。

如果您确实觉得应该抛出一个指针,请使用诸如的智能指针shared_ptr

无论如何,Herb Sutter和Alexei Alexandrescu在我解释的C ++编码标准书中对此做了很好的解释。


查看完整回答
反对 回复 2019-10-28
?
偶然的你

TA贡献1841条经验 获得超3个赞

捕获遵循正常的分配兼容性规则,也就是说,如果您抛出一个值,则可以将其捕获为值或引用,但不能将其捕获为指针。如果抛出指针,则只能将其作为指针(或对指针的引用...)来捕获。

但是抛出指针并没有任何意义,只会引起内存管理的麻烦。因此,通常应遵循按值抛出的规则,按引用捕获的规则,如Gregory所述。


查看完整回答
反对 回复 2019-10-28
?
jeck猫

TA贡献1909条经验 获得超7个赞

尽管实际上可以抛出任何类型的任何对象,但这样做几乎没有什么收获(如果有的话)。动态分配主要在对象的生存期不适合自动分配的情况下有用,例如,您希望其生存期独立于常规程序范围。

但是,对于异常对象,这实际上没有多大意义。通常,异常对象仅在异常处理程序内部使用,并且您明确希望在退出该异常的(最后一个)处理程序时将其销毁。

还有一个事实是,您通常希望保持异常处理代码相当简单。仅举例来说,如果您要报告已耗尽或损坏的免费存储/堆,则尝试从已耗尽/损坏的免费存储/堆中分配异常对象通常无法很好地工作...


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 604 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信