Я использую библиотеку log4cplus. Когда я создаю приложение, оно компилируется и работает правильно (ну, не совсем правильно, поскольку оно ничего не регистрирует, но это другая проблема), но когда я закрываю его, я получаю эту ошибку:
Run-Time Check Failure #2 - Stack around the variable 's1' was corrupted.
Вот мой код Я отметил соответствующие места с комментариями.
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow) {
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
////////////////// SET UP CHECKS FOR MEMORY LEAKS ////////////////////
_CrtMemState s1;
_CrtMemCheckpoint(&s1);
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//////////////////////////////////////////////////////////////////////
log4cplus::PropertyConfigurator config(_T("log.properties")); // <-- this line seems to be responsible for the issue. When I remove it, everything is ok.
_CrtMemDumpAllObjectsSince(&s1); // <-- here program breaks with mentioned error.
return 1;
}
Итак, как написано в комментариях, PropertyConfigurator()
Конструктор, кажется, несет ответственность за проблему. Ни один другой код в этом месте не вызывает такую же проблему.
Интересно, что может быть не так, если эта библиотека используется многими людьми, и она работает, хотя у меня есть проблемы с повреждением стека.
Кто-нибудь имеет представление о том, что здесь происходит?
РЕДАКТИРОВАТЬ:
Я удалил весь ненужный код (код выше отредактирован) и оставил только соответствующий. Еще log4cplus::PropertyConfigurator config(_T("log.properties"));
кажется, причина проблемы.
Эта ошибка Run-Time Check Failure #2
как правило, вызвано ошибкой где-то в памяти. После просмотра предоставленного вами образца вы должны изменить это:
log4cplus::PropertyConfigurator config(_T("log.properties"));
к этому:
log4cplus::PropertyConfigurator configure(_T("log.properties"));
Если это не помогает, тогда начните смотреть на инициализации памяти.
Других решений пока нет …