我有一个从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()
的前提条件之一是"必须至少存在一个拥有t
的shared_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年读到这篇文章的人,希望它能有所帮助!