Это действительно зависит от владельца, который вы должны решить при создании интерфейса. Скажем, у вас есть метод:
CWorker::AddItem(CWorkItem *workItem)
Вам необходимо указать, кому принадлежит память и для чего ее следует удалить. В зависимости от того, что вы пытаетесь сделать, для вызывающего может иметь смысл владеть им (например, если элементы должны регулярно использоваться совместно с CWorkers), или для CWorker - владеть им (если каждый CWorkItem принадлежит одному CWorker). Тот, кто владеет им, несет ответственность за его удаление.
В первом случае вы можете взять WorkItems как shared_ptrs, чтобы указать, что право собственности распределяется между Workers, и вам не нужно будет выполнять ручное удаление. В последнем случае вы также можете использовать специализированный контейнер, такой как ptr_vector , чтобы избавить от необходимости удаления вручную, но вы также должны заметить, что функция, которой вы управляете памятью.
Также, как примечание, delete является нулевым, поэтому вам не нужны эти операторы if, и pop_back () будет быстрее, чем pop_front ()