虚拟成员函数中使用boost :: bind的奇怪行为

时间:2011-09-02 03:10:03

标签: c++ boost bind

我有两个类,一个有虚函数

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来解决这个问题

非常感谢

2 个答案:

答案 0 :(得分:0)

在不知道wptr是什么的情况下,我只能猜测当测试超出范围时,CrashClass的实例将被删除。如果是这种情况,您应该能够移除大括号以防止崩溃。虽然“延迟”可能比“预防”更准确。

答案 1 :(得分:0)

boost::weak_ptr保证它指向的内存将会存在。这几乎是整个课程的重点。 weak_ptr的持有者有责任在调用之前锁定它(获取shared_ptr)和测试指针。否则,您使用weak_ptr错误。