【问题标题】:Handling exception before the assigning of a scoped_ptr在分配 scoped_ptr 之前处理异常
【发布时间】:2012-10-16 06:39:12
【问题描述】:

我的班级成员是boost::scoped_ptr,在创建对象时设置为(T*)0。该类有一个init() 方法,它实际上用一个新对象初始化智能指针。

但是,如果在智能指针具有有效引用之前抛出异常,它会非常不聪明地尝试删除 null(释放)或断言(调试)。

如何让它在销毁时忽略空指针而不修改原始源代码;并且,如果这不可能,是否有更合适的替代智能指针类来代替使用?

【问题讨论】:

  • 我怀疑您的代码有其他问题。 delete 0 完全有效(并且什么都不做)。请添加一个重现问题的最小测试用例。
  • 那么在调用init 之前,这种类型的对象在出现异常的情况下不能正常工作?那么只是将init 转换为构造函数,甚至没有这样的无效对象呢?除此之外,Mankarse 是正确的,delete 0 没什么不好,而且它本身也不是那么不聪明(实际上它比事先进行手动检查更聪明),并且并不真正花费任何成本.
  • @ChristianRau - 在紫红色的回答下查看我的评论。这是我的代码中的逻辑。我是一个糟糕的程序员,在发布之前没有单步执行代码:] 我做了一些测试用例,是的,Mankarse 是正确的。

标签: c++ exception boost smart-pointers


【解决方案1】:

您可以尝试使用std::unique_ptr 代替boost::scoped_ptr,并提供一个自定义删除函数来检查底层对象的状态 - 请参阅http://en.cppreference.com/w/cpp/memory/unique_ptr

【讨论】:

  • 我对 unique_ptr 的唯一不满是它与 c++0x 不兼容。如果它真的必须归结为它,我可以使用它,但在这种情况下我宁愿不必。
  • “它与 c++0x 不兼容” - 你的意思是 C++03/98,因为它非常适合 C++0x(或者更确切地说是 C+ +11) 兼容。
  • 哦,是的,是的,倒退了。
【解决方案2】:

boost::scoped_ptr 实际上忽略了其析构函数中的空指针。 boost::scoped_ptr 使用 boost::checked_delete() 进行删除。 boost::checked_delete() 使用纯 delete 来删除(boost::checked_delete() 还检查 T 不完整)。

您可以使用 delete 删除空指针(与 free() 不同)。您确定错误确实在 boost::scoped_ptr 中吗?

【讨论】:

  • 不是。这是我的代码的逻辑(我真的应该在发布之前仔细检查代码;谢谢你剥夺睡眠)。 scoped_ptr 跟踪控制台对象,并且在控制台对象被创建/分配给智能指针之前抛出了测试异常。然后,catch 块使用控制台对象记录错误,该错误当时还不存在,形成了一个空指针异常。
猜你喜欢
  • 2021-12-31
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2015-09-06
  • 1970-01-01
相关资源
最近更新 更多