Выделение памяти в COM
Иногда метод выделяет буфер памяти в куче и возвращает адрес буфера вызывающему объекту. COM определяет пару функций для выделения и освобождения памяти в куче.
- Функция CoTaskMemAlloc выделяет блок памяти.
- Функция CoTaskMemFree освобождает блок памяти, выделенный с помощью CoTaskMemAlloc.
Пример этого шаблона мы видели в примере диалогового окна Открытие:
PWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
if (SUCCEEDED(hr))
{
// ...
CoTaskMemFree(pszFilePath);
}
Метод GetDisplayName выделяет память для строки. Для выделения строки метод вызывает CoTaskMemAlloc . При возврате метода pszFilePath указывает на расположение памяти нового буфера. Вызывающий объект отвечает за вызов CoTaskMemFree для освобождения памяти.
Почему COM определяет собственные функции выделения памяти? Одной из причин является предоставление уровня абстракции над распределителем кучи. В противном случае некоторые методы могут вызывать malloc , а другие — new. Тогда вашей программе потребуется позвонить бесплатно в некоторых случаях и удалить в других, и отслеживать все это быстро станет невозможно. Функции выделения COM создают единый подход.
Еще одним соображением является тот факт, что COM является двоичным стандартом, поэтому он не привязан к конкретному языку программирования. Таким образом, COM не может полагаться на какую-либо форму выделения памяти для конкретного языка.
Следующая