Поделиться через


Управление памятью с помощью упаковщика взаимодействия

Упаковщик взаимодействия всегда пытается освободить память, распределенную неуправляемым кодом. Такое поведение согласуется с правилами управления памятью COM, но отличается от правил, присущих C++.

Путаница может возникать, если ожидается поведение в стиле C++ (память не освобождается) при вызове неуправляемого кода, при котором память автоматически освобождается для указателей. Например, вызов следующего неуправляемого метода из библиотеки DLL C++ не освобождает память автоматически.

Неуправляемая сигнатура

BSTR MethodOne (BSTR b) {
     return b;
}

Но если при определении метода в качестве прототипа вызова неуправляемого кода заменить каждый тип BSTR типом String и вызвать MethodOne, среда CLR дважды попытается освободить b. Поведение маршалинга можно изменить с помощью типов IntPtr, а не типов String.

Среда выполнения для освобождения памяти всегда использует метод CoTaskMemFree. Если память, с которой работает программа, не была освобождена с помощью метода CoTaskMemAlloc, необходимо использовать IntPtr и освободить память вручную с применением подходящего метода. Аналогичным образом можно устранить автоматическое освобождение памяти в ситуациях, когда память не должна освобождаться ни при каких обстоятельствах, например, при использовании функции GetCommandLine из Kernel32.dll, когда указатель возвращается в память ядра. Сведения об освобождении памяти вручную см. в разделе Пример буферов.

См. также

Основные понятия

Атрибуты направления

Преобразуемые и непреобразуемые типы

Копирование и закрепление

Другие ресурсы

Поведение маршалинга по умолчанию