我有一个派生自 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 的构造过程中抛出了一个错误的弱指针异常。还有别的办法吗
查看标准中的接口,我看不到任何可以进行像样测试的东西。当然,你总是可以破解这个问题:
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()
的结果就容易多了。
为对象
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
派生。这样就没有混淆了。
我也有同样的问题。幸运的是,C++17 添加了“weak_from_this”,这很有用,因为它从内部提供了 weak_ptr 的副本
std::enable_shared_from_this
,无论实例是否由共享指针管理。
简单地检查
this->weak_from_this().expired()
(这与根据标准检查use_count() == 0
相同)似乎可以解决问题。
致2034年阅读本文的人,希望对您有所帮助!