2016-06-29 13 views
0

私は「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」マーシャリングメソッドでハングする可能性があります。何がハングを引き起こす可能性がありますか?

+0

これをデバッガでステップ実行したか、printfデバッグだけを済ませましたか?あなたがその行を歩いていくとどうなりますか? –

+0

あなたの返事のためにDavidに感謝します。デバッグ中にハングアップが発生せず、しかもまれにハングアップしています(50回のうち1回) – Sadhu

+0

確かにこれが可能です。 SEH例外をキャッチするような賢明なことをしないと、ヒープを保護するロックをデッドロックする可能性があります。基本的なヒープの破損によって、アロケータが無限ループに陥る可能性があります。不快な問題、ワンボタン修正なし、それは答えます。 –

答えて

0

なぜ最初にCOMを使用していますか?そのコードにCOMは必要ありません。

免責事項:あなたはおそらくないが他の誰かconst char *を返すべきであるが、あなたの関数から解放する必要があります。これはメモリリークや複数のフリーエラーを生成する非常に簡単な方法です。

最初の方法:contextがスコープ内にあるよう

#include <msclr/marshal.h> 
msclr::interop::marshal_context context; 
const char* strValueAsCString = context.marshal_as<const char*>(strValue); 

// Probably bad 
const char* ansiStr = strdup(strValueAsCString); 

strValueAsCStringポインタは限り有効のままになります

は、上記の免責事項を無視して、あなたはカップルの可能性を持っています。


別の方法:ここで

#include <string> 
#include <msclr/marshal_cppstd.h> 
std::string strValueAsStdString = msclr::interop::marshal_as<std::string>(strValue); 

// Probably bad 
const char* ansiStr = strdup(strValueAsStdString.c_str()); 

は、std::stringは、文字列の寿命を管理します。


参照のためにOverview of Marshalingを参照してください。

+0

スレッドセーフ "StringToCoTaskMemAnsi"または "StringToHGlobalAnsi"ですか? – Sadhu

+0

@サドゥはその質問は何もしていません。これらの2つの機能は同じ目的を果たしておらず、ドキュメントを読んでいます。あなたはどちらかを使う必要はありません。 –

関連する問題