В некоторых очень редких случаях вы не можете использовать умный указатель (возможно, имеющий дело со старым кодом), но также не можете использовать простую схему "владения".
Представьте, что у вас есть std::vector<whatever*>
, и некоторые из whatever*
указателей указывают на один и тот же объект. Безопасная очистка подразумевает, что вы не удаляете одно и то же дважды, поэтому создайте std::set<whatever*>
по ходу работы и удаляйте только те указатели, которых еще нет в наборе. После удаления всех указанных объектов можно безопасно удалить оба контейнера.
Возвращаемое значение из insert
может использоваться для определения, был ли вставленный элемент новым или нет. Я не проверял следующее (или некоторое время использовал std :: set), но думаю, что это правильно ...
if (myset.insert (pointervalue).second)
{
// Value was successfully inserted as a new item
delete pointervalue;
}
Вы не должны разрабатывать проекты так, чтобы это было необходимо, конечно, но не так сложно справиться с ситуацией, если вы не можете избежать этого.