不知道这里发生了什么。
我有一个用 C 编写的 Windows 控制台应用程序。当我在 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。这有关系吗?
我习惯于制作文件和编译器,而且我知道 C。我不知道 C++,这就是我用 C 编写的原因。但我不理解 Windows 上 CRT 的所有变幻莫测。有人能解开这个谜吗?