На самом деле, лучшая идиома (используемая интерфейсами COM) состоит в том, чтобы потребовать создания указателя в вызывающей стороне до точки вызова функции и написать функцию, которая принимает двойной указатель.
Например :
HRESULT CreateDevice(
[in] UINT Adapter,
[in] D3DDEVTYPE DeviceType,
[in] HWND hFocusWindow,
[in] DWORD BehaviorFlags,
[in, out] D3DPRESENT_PARAMETERS *pPresentationParameters,
<b>[out, retval] IDirect3DDevice9 **ppReturnedDeviceInterface</b>
);
Таким образом, вызывающая сторона отвечает за создание указателя и вызов функции выделения, и поэтому с большей вероятностью не забудет вызвать функцию освобождения (что в случае с COM требует, чтобы вы вызывали метод ->Release()
для объекта COM)
Но я думаю, что принятие функций создания / уничтожения в сочетании с передачей двойных указателей является лучшим способом напомнить получателю о выделенном объекте кучи для очистки после использования объекта.
Я согласен с Oli , что функции Create / Destroy гораздо более симметричны и существование функции Destroy должно превратить пользователя API в тот факт, что эти объекты, которые он получает от Функции создания не просто исчезают сами по себе, и их (Destroy fcns) нужно вызывать.