Здравствуйте, 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 каким-то хитрым способом строит список инициализации или что?