Re[4]: [boost][asio] boost::asio::placeholders::error
От: fk Россия  
Дата: 30.11.11 13:46
Оценка: 14 (3)
Здравствуйте, savitar, Вы писали:

S>Ничего криминального в указанном месте нет. Видимо где-то память хериться.


Как оказалось дело было в следующем.
В самом начале запуска программы происходит инициализация глобальных переменных,
в том числе и boost::asio::placeholders::error
  boost::arg<1>& error
    = boost::asio::placeholders::detail::placeholder<1>::get();

После этого вывоза она инициализируется, все хорошо.. &error показывает валидный адрес
Эта инициализация вызывается три раза. Причем между ними &error показывает 0.

Моя программа — это сервис windows, и я делаю ее с помощью ATL, где
есть класс CAtlServiceModuleT, который помогает в создании сервиса и управлении им.
Создание внутренних объектов происходит прямо в конструкторе моего унаследованного класса.
CMDBCopySrvModule() : CAtlServiceModuleT()
{
    m_pCopyManager = new CCopyManager();
    m_pNetServer = new CNetCopyServer(m_pCopyManager);
    m_pNetServer->StartServer();
}

Объект этого класса тоже является глобальной переменной и ее создание происходит вместе с placeholders::error.
Причем она вклинивается между теми тремя инициализациями placeholders::error.
И получается что уже в конструкторе моего класса &error = 0.
(На момент входа в этот конструктор &error еще валидный. Но дальше происходит нечто странное.
Как только я захожу в конструктор CCopyManager, &error становиться равен 0.)

Проблема решилась переносом создания внутренних объектов в метод RunMessageLoop.
Получается что нельзя пользоваться asio в конструкторе глобальных объектов, так как некоторые его объекты еще не до конца созданы.

Но я по-прежнему не понимаю где &error успевает обнуляться между этими вызовами и почему их три?
CRT каким-то хитрым способом строит список инициализации или что?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.