странное поведение с boost :: bind в виртуальной функции-члене - PullRequest
0 голосов
/ 02 сентября 2011

у меня есть два класса, у одного есть виртуальная функция

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;  
    }  
}; 

Я поместил два класса в следующий тестовый код сбой CrashClass при вызове func () 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

Я знаю причину, по которой первый класс работает, а второй разбился

и я использую Functor для решения этой проблемы

все равно спасибо

Ответы [ 2 ]

0 голосов
/ 07 сентября 2011

boost::weak_ptr не гарантирует , что память, на которую он указывает, останется. Это в значительной степени весь смысл класса. Владелец weak_ptr обязан заблокировать его (получив shared_ptr) и проверить этот указатель перед его вызовом. В противном случае вы используете weak_ptr неправильно.

0 голосов
/ 02 сентября 2011

Не зная, что такое wptr, я могу только догадываться, что когда тест выходит из области видимости, экземпляр CrashClass удаляется. Если это так, вы должны быть в состоянии удалить скобки, чтобы предотвратить сбой. Хотя «задержка», вероятно, более точна, чем «предотвращение».

...