私は「cashincdistores--はStringToCoTaskMemAnsiを呼び出すために行く」とそこ疑っ見ることができます私たちのログではStringToCoTaskMemAnsiStringToCoTaskMemUniまたはStringToCoTaskMemAnsiメソッドがハングアップする可能性がありますか?
const char* CDICashInStringStore::CDIGetStringVal(void)
{
unsigned int identifier = (unsigned int)_id;
debug(" cashincdistores--routing call to .Net for CDI String %d", identifier);
NCR::APTRA::INDCDataAccess::IStringValue^ stringValueProvider = (NCR::APTRA::INDCDataAccess::IStringValue^)GetStringProvider()->GetProvider();
String^ strValue = stringValueProvider->GetStringValue(identifier);
debug(" cashincdistores-- going to call StringToCoTaskMemAnsi);
IntPtr iPtr = Marshal::StringToCoTaskMemAnsi(strValue);
debug(" cashincdistores-- StringToCoTaskMemAnsi called);
// use a local (retVal is not needed)
const char * ansiStr = strdup((const char *) iPtr.ToPointer());
Marshal::FreeCoTaskMem(iPtr);
debug(" cashincdistores--got results %d %s",identifier,ansiStr);
// The returned memory will be free() 'ed by the user
return ansiStr;
}
を使用してchar *に、.NETの文字列を変換しながらハングC++/CLIと観察して以下のコードを持っています'StringToCoTaskMemAnsi'メソッドを呼び出した後ハングします。
「StringToCoTaskMemAnsi」マーシャリングメソッドでハングする可能性があります。何がハングを引き起こす可能性がありますか?
これをデバッガでステップ実行したか、printfデバッグだけを済ませましたか?あなたがその行を歩いていくとどうなりますか? –
あなたの返事のためにDavidに感謝します。デバッグ中にハングアップが発生せず、しかもまれにハングアップしています(50回のうち1回) – Sadhu
確かにこれが可能です。 SEH例外をキャッチするような賢明なことをしないと、ヒープを保護するロックをデッドロックする可能性があります。基本的なヒープの破損によって、アロケータが無限ループに陥る可能性があります。不快な問題、ワンボタン修正なし、それは答えます。 –