1

我需要在我的 CLI 包装器中进行多次转换,System::String^并且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::string而不是 raw char*s,这一切都会变得更容易。尝试这个:

#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 回答