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

strange behavior with boost::bind in virtual member function

本文关键字:bind 函数 boost 成员      更新时间:2023-10-16

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

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打印单词"print from OK class",这是不应该的。因为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

我已经知道为什么第一个班可以工作,而第二个班却崩溃了

和我已经使用函子来解决这个问题

谢谢

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

boost::weak_ptr保证它所指向的内存会一直存在。这就是这门课的重点。weak_ptr的持有者有责任锁定它(获得shared_ptr),并在调用它之前测试指针。否则,您使用weak_ptr错误。