Преобразование System :: String в char * в функции с StringToHGlobalAnsi - PullRequest
1 голос
/ 18 июля 2011

Мне нужно много преобразований в моей оболочке CLI от System::String^ до char*, и я написал функцию, но я не могу освободить пространство кучи перед возвратом char*!(получить кучу ошибок за это время)

Преобразование

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

    return str2;
}

Я использую функцию как:

GetSomething(SystemStringToChar(str), value);

Есть идеи?!

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

В конечном счете, кто-то должен нести ответственность за освобождение памяти, в которой хранится ваше возвращаемое значение. Это не может быть ваша функция преобразования, поскольку она вернется до того, как вы захотите освободить память.

Все становится проще, если вы используете std::string вместо char* s. Попробуйте это:

#include <msclr/marshal_cppstd.h>
...     
GetSomething(msclr::interop::marshal_as<std::string>(str).c_str(), value);
2 голосов
/ 19 июля 2011

В каждом методе:

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
{
    ...
}   

Теперь должно быть чисто!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...