Я собирался написать класс, который считывает std::cin
в потоке и вызывает обратный вызов, когда что-то вводится. Обратный вызов представляет собой boost::function
. Код запускается, если у меня есть только std::getline (std::cin, command);
, но вылетает с «нарушением доступа», если я добавляю строку if(this->m_receiveHandler != NULL)
. Я действительно не могу понять, что происходит, поэтому я свел проблему к следующему тесту.
Проблема не полностью детерминированная, иногда могу ввести строку или две, иногда сразу вылетает. Последнее, что выводит программа, это всегда "обработчик приемника доступа".
class InputReader
{
private:
boost::function<void (const char*, unsigned int) > m_receiveHandler;
boost::thread m_receiveThread;
void receiveLoop(void)
{
while(true)
{
std::string command;
std::getline (std::cin, command);
std::cout << "access receiver handler" << std::flush;
if(this->m_receiveHandler != NULL)
{
}
}
}
public:
InputReader()
{
m_receiveThread = boost::thread(boost::bind(&InputReader::receiveLoop, this));
}
};
TEST(InputReaderTest, WaitInfinite)
{
InputReader reader;
while (true) {};
}
Вы видите что-то не так с этим кодом?
РЕДАКТИРОВАТЬ: я компилирую с GCC 4.3.2 на Suse Linux с Boost 1.49.
m_receiveHandler
не указатель, можно смело сравнивать сNULL
? Возможно, эта строка пытается создатьboost::function
изNULL
. РЕДАКТИРОВАТЬ: существуетempty()
a> функция-член, которую вы могли бы использовать. - person BoBTFish   schedule 17.04.2013TEST()
, где я просто поместилInputReader read;
вmain()
вместо этого и не получил ошибки сегмента после нескольких записей вstdin
. Это весь код, в котором есть ошибки seg, и вы определенно перестроили его? - person hmjd   schedule 17.04.2013f != NULL
дает то же логическое значение, что иf
(или!f.empty()
, если вам нравится многословие). - person Mike Seymour   schedule 17.04.2013getline
) не обращаются ни к каким объектам-членам, поэтому они никогда не завершаются с ошибкой. - person Igor R.   schedule 17.04.2013if(!m_receiveHandler.empty())
, который дает тот же эффект. - person Philipp   schedule 17.04.2013# include
одну и ту же версию boost (возможно, на вашем компьютере установлено 2 версии и вы их случайно перепутали). - person Igor R.   schedule 17.04.2013