我有一个派生自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期间抛出了一个错误的弱指针异常。还有另一种方式。
答案 0 :(得分: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
异常并让原始异常转义函数。
顺便说一下,当抛出一个butin时,会强烈建议抛出一个来自std::exception
的异常。如果你遇到异常,你就什么都不知道你会诅咒那个创建它的人,因为要弄清楚它是什么并不总是很容易找到它(虽然调试器可以提供帮助,如果有必要,可以设置一个休息时间指向抛出异常的内部函数)。只写what()
的结果要容易得多。
答案 1 :(得分:3)
为对象shared_from_this()
调用t
的前提条件之一是“必须存在至少一个拥有shared_ptr
的{{1}}实例p
”(见the Boost documentation)。 t
的C ++ 11规范具有相同的要求。
由于enable_shared_from_this
没有其他(已记录的)成员,因此无法测试从enable_shared_from_this
派生的对象是否实际归enable_shared_from_this
所有。
那就是说,为了清楚起见,最好只从shared_ptr
派生,只要该类型的对象始终归enable_shared_from_this
所有。这样就没有混淆了。