2011-07-18 9 views
1

System::String^からchar*に多くの変換が必要ですが、関数を書きましたが、char*を返す前にヒープスペースを解放することはできません!System :: StringをStringToHGlobalAnsiの関数で

変換私はのような機能を使用し

char* ManagedReaderInterface::SystemStringToChar(System::String ^source) 
{   
    char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(source); 

    return str2; 
} 

(時間をかけてヒープエラーが発生します):

GetSomething(SystemStringToChar(str), value); 

任意のアイデア?

+0

最初に 'System :: String'の代わりに' char * 'を使用できますか? –

+0

ネイティブのC++クラスのラッパーです。はい、それはCLI関数のSystem:Stringでなければなりません! – leon22

答えて

4

最終的には、戻り値が格納されているメモリを解放する責任を負う必要があります。メモリを解放する前に戻りますので、変換関数にすることはできません。

char*の代わりにstd::stringを使用すると、これはすべて簡単になります。一つ一つの方法では

#include <msclr/marshal_cppstd.h> 
...  
GetSomething(msclr::interop::marshal_as<std::string>(str).c_str(), value); 
+0

ありがとう!しかし、私はchar *に変換するのではなくconst char *に変換できます。 – leon22

+0

これは単なる例です。本当に 'char *'を使いたいのであれば、範囲外になったときにメモリを解放するカスタム 'raii'ラッパーを作成することができます。 –

+0

私はこの問題を抱えており、あなたの答えは私の解決策を解決しました。また、StackOverflow.comには、句読点を認識することにより、Googleよりも効果的な検索エンジンを提供していただきありがとうございます。 –

2

::このお試しください

IntPtr memHandle = Marshal::StringToHGlobalAnsi(string); 

try 
{ 
    char *charStr = static_cast<char*>(memHandle .ToPointer()); 

    // do something with charStr 

    Marshal::FreeHGlobal(memHandle); // free space -> Attention: don't delete it to soon 
} 
catch 
{ 
    ... 
} 

を今はきれいにする必要があります!

+0

「空き容量 - >注意:あまりにも早く削除しないでください」 私は知りたいです。私のアプリはここのどこかでランダムにクラッシュするからです。 – sajas

関連する問題