检测对象是否由智能指针拥有

时间:2012-01-04 22:51:38

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

我有一个派生自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期间抛出了一个错误的弱指针异常。还有另一种方式。

2 个答案:

答案 0 :(得分:3)

查看标准中的界面,我看不到任何可以进行体面测试的内容。当然,你总能解决这个问题:

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异常并让原始异常转义函数。

顺便说一下,当抛出一个butin时,会强烈建议抛出一个来自std::exception的异常。如果你遇到异常,你就什么都不知道你会诅咒那个创建它的人,因为要弄清楚它是什么并不总是很容易找到它(虽然调试器可以提供帮助,如果有必要,可以设置一个休息时间指向抛出异常的内部函数)。只写what()的结果要容易得多。

答案 1 :(得分:3)

为对象shared_from_this()调用t的前提条件之一是“必须存在至少一个拥有shared_ptr的{​​{1}}实例p”(见the Boost documentation)。 t的C ++ 11规范具有相同的要求。

由于enable_shared_from_this没有其他(已记录的)成员,因此无法测试从enable_shared_from_this派生的对象是否实际归enable_shared_from_this所有。

那就是说,为了清楚起见,最好只从shared_ptr派生,只要该类型的对象始终归enable_shared_from_this所有。这样就没有混淆了。