1

System::String^CLI ラッパーで からへの多くの変換が必要で、関数を作成しましたが、 !char*を返す前にヒープ領域を解放できません。char*(時間の経過とともにヒープエラーを取得します)

変換

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

    return str2;
}

私は次のような関数を使用します:

GetSomething(SystemStringToChar(str), value);

何か案は?!

4

2 に答える 2

4

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

std::stringraw の代わりに使用すると、これはすべて簡単になりますchar*。これを試して:

#include <msclr/marshal_cppstd.h>
...     
GetSomething(msclr::interop::marshal_as<std::string>(str).c_str(), value);
于 2011-07-18T14:22:40.607 に答える
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
{
    ...
}   

これできれいになるはずです!

于 2011-07-19T08:10:56.380 に答える