【问题标题】:Detecting if a object is owned by a smart pointer检测对象是否由智能指针拥有
【发布时间】:2012-02-02 20:23:54
【问题描述】:

我有一个派生自 enable_shared_from_this 的类和一个通过调用 shared_from_this() 返回共享指针的方法。我想在该方法中检测对象是否由 shared_ptr 所有,如果不被抛出。我尝试过这样的事情:

shared_ptr<T> getPointer() {
    shared_ptr<T> ptr(shared_from_this()));
    if(!ptr)
        throw "Not owned by smart pointer"
    return ptr;
}

这不起作用,因为在 ptr 的构造过程中抛出了一个糟糕的弱指针异常。有没有别的办法。

【问题讨论】:

  • 你不能捕捉到异常吗?
  • 对不起,我可能是傻了,但听起来你没有问题:你想在某种情况下抛出异常,然后你发现异常已经在在那种情况下,所以你实际上不必做任何特别的事情。没有?
  • 我真的不喜欢库中的 try catch 块。就像应用程序的包装器一样。
  • 是和否:)。我想专门化异常并给它一个不同于 boost 抛出的文本。

标签: c++ boost c++11 shared-ptr smart-pointers


【解决方案1】:

查看标准中的界面,我看不到任何可以进行体面测试的东西。当然,您可以随时解决问题:

std::shared_ptr<T> getPointer() {
    try {
        return this->shared_from_this());
    }
    catch (std::bad_weak_ptr const&) {
        throw std::runtime_error("not owned by smart pointer");
    }
}

当然,您也可以不捕获std::bad_weak_ptr 异常并让原始异常转义函数。

顺便说一句,当抛出异常时,强烈建议抛出从std::exception 派生的异常。如果您遇到异常,您将一无所知,您会诅咒创建它的人,因为要掌握该异常以找出它的含义并不总是那么容易(尽管调试器可以提供帮助,如果有必要,可以通过设置中断指向抛出异常的内部函数)。只写what() 的结果要容易得多。

【讨论】:

  • 正如我在上面的评论中提到的,我尽量避免在库方面尝试捕获。我知道异常。那只是 SO 的简写。实际代码抛出一个 std::runtime_error。
【解决方案2】:

为对象t 调用shared_from_this() 的先决条件之一是“必须至少存在一个拥有tshared_ptr 实例p”(请参阅​​the Boost documentation)。 enable_shared_from_this的C++11规范也有同样的要求。

由于enable_shared_from_this 没有其他(记录在案的)成员,因此似乎无法测试从enable_shared_from_this 派生的对象是否实际上由shared_ptr 拥有。

也就是说,为了清楚起见,最好从enable_shared_from_this 派生,前提是该类型的对象将始终由shared_ptr 拥有。这样就不会混淆了。

【讨论】:

  • 但是没有办法明确地强制执行这一点。最接近的是将构造函数设为私有并创建一个工厂方法,该方法返回一个指向对象的智能指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2020-03-16
  • 1970-01-01
  • 2013-08-10
  • 2013-08-19
相关资源
最近更新 更多