Управление памятью с помощью упаковщика взаимодействия
Упаковщик взаимодействия всегда пытается освободить память, распределенную неуправляемым кодом. Такое поведение согласуется с правилами управления памятью COM, но отличается от правил, присущих C++.
Путаница может возникать, если ожидается поведение в стиле C++ (память не освобождается) при вызове неуправляемого кода, при котором память автоматически освобождается для указателей. Например, вызов следующего неуправляемого метода из библиотеки DLL C++ не освобождает память автоматически.
Неуправляемая сигнатура
BSTR MethodOne (BSTR b) {
return b;
}
Но если при определении метода в качестве прототипа вызова неуправляемого кода заменить каждый тип BSTR типом String и вызвать MethodOne, среда CLR дважды попытается освободить b. Поведение маршалинга можно изменить с помощью типов IntPtr, а не типов String.
Среда выполнения для освобождения памяти всегда использует метод CoTaskMemFree. Если память, с которой работает программа, не была освобождена с помощью метода CoTaskMemAlloc, необходимо использовать IntPtr и освободить память вручную с применением подходящего метода. Аналогичным образом можно устранить автоматическое освобождение памяти в ситуациях, когда память не должна освобождаться ни при каких обстоятельствах, например, при использовании функции GetCommandLine из Kernel32.dll, когда указатель возвращается в память ядра. Сведения об освобождении памяти вручную см. в разделе Пример буферов.
См. также
Основные понятия
Преобразуемые и непреобразуемые типы