Это зависит.
Вы должны выбрать политику владения объектом. Но в целом, если объект является подобъектом (членом) другого, объект, частью которого он является, отвечает за его время жизни и (как правило) очищает его от своего деструктора.
Выдача памяти для очистки вызывающей стороной обычно вызывает недовольство. В C библиотеки, которые должны выделять память для вызывающих (скажем, библиотек X Windows или API C для клиента базы данных), будут выдавать непрозрачный указатель, который должен быть уничтожен вызывающей стороной путем вызова другой библиотечной функции:
Window foo = APIcreateWindow();
APIsetupWindow(foo, x, y, z );
AOIshowWindow(foo);
APIdestroyWindow(foo); //forgetting to call this leaks memory
В этом (гипотетическом) коде Window
на самом деле является typedef для указателя на struct; APICreateWindow выделил память для структуры, APIdestroyWindow вызывает ее, после того, как занялся другой бухгалтерией API.
В C ++ мы, вероятно, вернем умный указатель, который разрушается, когда на него больше ничего не ссылается.