正在检测对象是否为智能指针所拥有



我有一个从enable_shared_from_this派生的类和一个通过调用shared_from_his()返回共享指针的方法。我想在该方法中检测对象是否为shared_ptr所有,以及是否为throw。我试过这样的东西:

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

但这并不起作用,因为在构造ptr的过程中抛出了一个坏的弱指针异常。还有别的办法吗。

看看标准中的接口,我看不出任何能做一个好测试的东西。当然,你总是可以绕过这个问题:

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()的结果要容易得多。

为对象t调用shared_from_this()的前提条件之一是"必须至少存在一个拥有tshared_ptr实例p"(请参阅Boost文档)。enable_shared_from_this的C++11规范也有同样的要求。

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

也就是说,为了清楚起见,只有当shared_ptr始终拥有该类型的对象时,才可能最好从enable_shared_from_this派生。这样就不会产生混淆。

我也遇到了同样的问题。幸运的是,C++17添加了";weak_from_this";,这是有帮助的,因为它从CCD_。

简单地检查this->weak_from_this().expired()(这与根据标准检查use_count() == 0相同)似乎起到了作用。

对于2034年读到这篇文章的人,希望它能有所帮助!

相关内容

  • 没有找到相关文章

最新更新