c++ 检测对象是否为智能指针所有

envsm3lx  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(166)

我有一个派生自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的过程中抛出了一个错误的弱指针异常。

qco9c6ql

qco9c6ql1#

看看标准中的接口,我看不出有什么可以做一个像样的测试。当然,你总是可以解决这个问题:

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

wgxvkvu9

wgxvkvu92#

为对象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拥有时,才可能从enable_shared_from_this派生出来。

vyswwuz2

vyswwuz23#

幸运的是,C++17添加了“weak_from_this”,这很有帮助,因为它提供了std::enable_shared_from_this中weak_ptr的副本,无论示例是否从共享指针管理。
简单地检查this->weak_from_this().expired()(这与根据标准检查use_count() == 0相同)似乎可以做到这一点。
在2034年阅读这篇文章的人,希望能有所帮助!

相关问题