我有两个类,一个有虚函数
class OKClass
{
public:
void PrintTest() {
std::cout << "print from OK class " << std::endl;
}
};
class CrashClass
{
public:
virtual void PrintTest() {
std::cout << "print from virtual Crash class " << std::endl;
}
};
我将这两个类放在以下测试代码中 调用func()时CrashClass崩溃 OkClass打印“打印从OK类”这个词,不应该。因为在超出范围时发布了shared_ptr测试。 可以向我解释为什么会发生这种奇怪的事情吗?
谢谢
boost::function0<void> func;
{
boost::shared_ptr<CrashClass> test(new CrashClass);
func = boost::bind(&CrashClass::PrintTest, boost::bind(&CrashClass::wptr::lock, CrashClass::wptr(test)));
}
func();
缺乏信息
typedef boost::weaked_ptr<CrashClass> wptr
我知道第一堂课有效的原因,第二堂课崩溃了
我使用Functor来解决这个问题
非常感谢
答案 0 :(得分:0)
在不知道wptr是什么的情况下,我只能猜测当测试超出范围时,CrashClass的实例将被删除。如果是这种情况,您应该能够移除大括号以防止崩溃。虽然“延迟”可能比“预防”更准确。
答案 1 :(得分:0)
boost::weak_ptr
不保证它指向的内存将会存在。这几乎是整个课程的重点。 weak_ptr
的持有者有责任在调用之前锁定它(获取shared_ptr
)和测试指针。否则,您使用weak_ptr
错误。