Черт возьми, мне пришлось немного подумать об этом - я выполнил немало мелкого COM-программирования с ATL и редко использовал его.
Однако на ум приходит одна ситуация: Расширения оболочки Windows . Если вы имеете дело с набором объектов файловой системы, вам, возможно, придется иметь дело с PIDLs (указатель на список идентификаторов). Это причудливые небольшие абстракции объектов файловой системы, и они должны быть явно выделены / освобождены с использованием распределителя с поддержкой COM, такого как CoTaskMemAlloc
. Существует также альтернатива, указатель интерфейса IMalloc
, полученный из SHGetMalloc
(устарело) или CoGetMalloc
- это просто уровень абстракции для использования, так что ваш код не привязан к конкретный распределитель памяти и может использовать любой подходящий.
Смысл использования CoTaskMemAlloc
или IMalloc
вместо malloc()
заключается в том, что выделение / освобождение памяти должно быть чем-то, что "COM-осознает", чтобы его распределение и освобождение выполнялись согласованно во время выполнения даже если выделение и освобождение выполняются с помощью совершенно не связанного кода (например, Windows выделяет память, передает ее в ваш код C ++, который впоследствии освобождается, или ваш код C ++ выделяет, передает его в чужой код VB, который позднее освобождает). Ни malloc()
, ни new
не способны взаимодействовать с динамической кучей системы, поэтому их нельзя использовать для выделения памяти для передачи другим объектам COM или для получения памяти от других объектов COM и освобождения.