ここで何が起こっているのかわからない。
Cで記述されたWindowsコンソールアプリがあります。VS2008内から実行すると、正常に実行されます。cmd.exeプロンプトから実行すると、通常はmalloc()でクラッシュします。CRTライブラリの不一致による競合状態だと思います。
アプリはシンプルです。
WinHttpレイヤーを呼び出してGETリクエストをWebサイトに送信し、応答を丸呑みにします。その部分は正常に機能しているように見えますが、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) ??
いくつかの質問 -
VS2008内で利用可能なPATHのために、異なる動作はありますか?
マシンにVC90ランタイムがインストールされていないことが原因でしょうか?
静的にリンクする(/ MT)ことで、VC90ランタイムをインストールする必要がなくなると思いましたか?
私はまだ/NODEFAULTLIBを理解していません。それは関係がありますか?
私はファイルやコンパイラを作成するのに慣れていて、Cを知っています。C++を知らないので、Cで記述しています。しかし、Windows上のCRTのすべての気まぐれを理解していません。誰かがこの謎を解くことができますか?