Можно ли использовать оператор удаления вместо маршала.Бесплатный глобальный метод для освобождения памяти от wchar_t*?

#c -cli

Вопрос:

Я прочитал официальную документацию по StringToHGlobalUni методу, и в ней говорится, что FreeHGlobal метод следует использовать для освобождения памяти.

Память, выделенная StringToHGlobalUni методом, находится в собственной куче, поэтому я не понимаю, почему delete нельзя использовать оператор.

Я много искал, но не смог найти никакого объяснения, почему я не могу использовать оператор удаления.

Я новичок в этом, и некоторые объяснения помогли бы мне. Можно ли использовать оператор удаления или нет ?

Код

 const wchar_t* filePath = (const wchar_t*)(Marshal::StringToHGlobalUni(inputFilePath)).ToPointer();
Marshal::FreeHGlobal(IntPtr((void*)filePath));
 

Комментарии:

1. Если вы создали объект с помощью new , вы должны уничтожить объект с помощью delete . Что еще более важно, если вы не создавали объект с помощью new , вы не должны уничтожать объект с помощью delete .

2. Программа (Windows) может иметь более одной кучи …

3. Обратите внимание, что FreeHGlobal должно быть в finally

4. Почему тебя это должно волновать? Просто делайте то, что вам предписывает документация.

5. Разница в том, что new и delete управляют памятью в свободном хранилище C , а также создают и уничтожают объекты, в то время как AllocHGlobal и FreeHGlobal управляют памятью в неуправляемой памяти процесса. удаление не вызывает FreeHGlobal . Я не уверен, что понимаю, чего вы не понимаете в этом.

Ответ №1:

Не используйте Marshal::StringToHGlobalUni в C /CLI.

Используйте либо

  1. PtrToStringChars (доступ к символам Юникода на месте, без выделения) или
  2. marshal_as<std::wstring> (управляет выделением с помощью класса интеллектуальных указателей, который будет освобождать его правильно и автоматически)

Помимо того факта, что StringToHGlobalUni требуется освободить память вручную, название этой функции полностью вводит в заблуждение. Это не имеет абсолютно никакой связи HGLOBAL ни с чем.