#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.
Используйте либо
PtrToStringChars
(доступ к символам Юникода на месте, без выделения) илиmarshal_as<std::wstring>
(управляет выделением с помощью класса интеллектуальных указателей, который будет освобождать его правильно и автоматически)
Помимо того факта, что StringToHGlobalUni
требуется освободить память вручную, название этой функции полностью вводит в заблуждение. Это не имеет абсолютно никакой связи HGLOBAL
ни с чем.