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

问题描述 投票:0回答:3

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

c++ boost c++11 shared-ptr smart-pointers
3个回答
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
异常并让原始异常转义该函数。

顺便说一句,当抛出异常时,强烈建议抛出从

std::exception
派生的异常。如果你遇到了一个你一无所知的异常,你会诅咒创建它的人,因为获取异常以找出它是关于什么的并不总是那么容易(尽管调试器可以提供帮助,如有必要,可以设置一个中断指向抛出异常的内部函数)。只写
what()
的结果就容易多了。


3
投票

为对象

shared_from_this()
调用
t
的先决条件之一是“必须至少存在一个拥有
shared_ptr
p
实例
t
”(参见 Boost 文档)。
enable_shared_from_this
的 C++11 规范具有相同的要求。

由于

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

就是说,为了清楚起见,只有当该类型的对象始终由

enable_shared_from_this
拥有时,才可能最好从
shared_ptr
派生。这样就没有混淆了。


0
投票

我也有同样的问题。幸运的是,C++17 添加了“weak_from_this”,这很有用,因为它从内部提供了 weak_ptr 的副本

std::enable_shared_from_this
,无论实例是否由共享指针管理。

简单地检查

this->weak_from_this().expired()
(这与根据标准检查
use_count() == 0
相同)似乎可以解决问题。

致2034年阅读本文的人,希望对您有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.