Когда нужно использовать FreeHGlobal ()? - PullRequest
2 голосов
/ 08 октября 2011

Если я использую Marshal::StringToHGlobalAnsi следующим образом:

char *src = (char *)Marshal::StringToHGlobalAnsi(this->Textbox1->Text).ToPointer();

Нужно ли использовать Marshal::FreeHGlobal()?И если какой параметр мне дать?

Ответы [ 3 ]

4 голосов
/ 08 октября 2011

Согласно MSDN - да, вам нужно позвонить во FreeHGlobal. http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.stringtohglobalansi%28v=VS.100%29.aspx:

Поскольку этот метод выделяет неуправляемую память, необходимую для строка, всегда освобождайте память, вызывая FreeHGlobal

2 голосов
/ 09 октября 2011

Функции преобразования строк в C # абсолютно ужасны по стандартам C ++.

C ++ / CLI имеет свои собственные помощники преобразования строк, которые следуют правилам RAII для автоматической очистки временных буферов.Просто используйте:

#include <stdlib.h>
#include <string.h>
#include <msclr\marshal.h>

using namespace msclr::interop;

marshal_context converter;
const char *src = converter.marshal_as<const char*>(Textbox1->Text);
1 голос
/ 04 февраля 2013

Прикрепите мой код 2 практики для Marshal :: FreeHGlobal Обратите внимание, что аргумент Marshal :: FreeHGlobal () различен !!

string CPlusPlusString;
String ^VisualString;
VisualString=textBox1->Text;
CPlusPlusString=(char *)Marshal::StringToHGlobalAnsi(VisualString).ToPointer();
Marshal::FreeHGlobal(Marshal::StringToHGlobalAnsi(VisualString));

char *CString;
String ^VisualString;
VisualString=textBox1->Text;
CString = (char*) Marshal::StringToHGlobalAnsi(VisualString).ToPointer();
Marshal::FreeHGlobal(IntPtr(CString));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...