Не уверен, что здесь происходит.
У меня есть консольное приложение Windows, написанное на C. Когда я запускаю его из VS2008, оно работает нормально. Если я запускаю его из командной строки cmd.exe, происходит сбой, как правило, в malloc (). Я предполагаю, что это состояние гонки из-за несоответствующей библиотеки CRT.
Приложение простое.
Он вызывает уровень WinHttp, чтобы отправить GET-запрос на веб-сайт, а затем отбрасывает ответ. Эта часть, кажется, работает нормально, но после WinHttpReadData программа вызывает printf (), чтобы распечатать полученные данные, и именно здесь часто происходит сбой malloc.
Но только за пределами отладчик.
????
Я компилирую из командной строки.
c:\vc9\bin\cl.exe /Zi /DEBUG -Ic:\vc9\Include
-IC:\WindowsSDK\v6.1\Include HttpGet.c
-link /debug /out:HttpGet.exe /SUBSYSTEM:CONSOLE /LIBPATH:c:\vc9\Lib
/LIBPATH:C:\WindowsSDK\v6.1\Lib WinHttp.lib
Я вижу результаты выше, если я скомпилирую с / MT, или ничего. Если я компилирую с / MD, то он зависает при запуске в отладчике, при вызове free (), и вылетает в cmd.exe (так же, как с / MT).
run in result: /MT result: /MD
--------- ------------ -----------
VS2008 debugger runs fine hang in free() (at the end)
cmd.exe crash in malloc crash in malloc
"VC cmd prompt" crash or hang(spin) ??
Некоторые вопросы -
Есть ли другое поведение из-за PATH, доступного в VS2008?
Может быть причина в том, что на моей машине не установлена среда исполнения VC90?
Я думал, что при статическом связывании (/ MT) у меня не будет необходимости устанавливать среду выполнения VC90?
Я все еще не понимаю / NODEFAULTLIB. Это актуально?
Я привык к make-файлам и компиляторам, и я знаю C. Я не знаю C ++, поэтому я пишу на C. Но я не понимаю всех капризов CRT в Windows. Может кто-нибудь разгадать эту тайну?