我有一个派生自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的过程中抛出了一个错误的弱指针异常。
3条答案
按热度按时间qco9c6ql1#
看看标准中的接口,我看不出有什么可以做一个像样的测试。当然,你总是可以解决这个问题:
当然,您也可以不捕获
std::bad_weak_ptr
异常,而让原始异常转义函数。顺便说一句,当抛出一个异常时,强烈建议抛出一个从
std::exception
派生的异常。如果你得到了一个异常,你什么都不知道,你会诅咒创建它的人,因为它并不总是容易得到那个异常来找出它是关于什么的。(虽然调试器可以提供帮助,如果需要的话,在内部函数中设置一个断点来抛出异常)。只写what()
的结果要容易得多。wgxvkvu92#
为对象
t
调用shared_from_this()
的前提条件之一是“必须存在至少一个拥有t
的shared_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
派生出来。vyswwuz23#
幸运的是,C++17添加了“weak_from_this”,这很有帮助,因为它提供了
std::enable_shared_from_this
中weak_ptr的副本,无论示例是否从共享指针管理。简单地检查
this->weak_from_this().expired()
(这与根据标准检查use_count() == 0
相同)似乎可以做到这一点。在2034年阅读这篇文章的人,希望能有所帮助!