Есть очень редкие случаи, когда вы, возможно, не сможете использовать интеллектуальный указатель (возможно, имеющий дело со старым кодом), но не можете использовать простую схему «собственности».
Представьте, что у вас есть std::vector<whatever*>
, а некоторые указатели whatever*
указывают на тот же объект. Безопасная очистка включает в себя обеспечение того, что вы не удаляете одно и то же дважды - создайте std::set<whatever*>
по ходу дела и удалите указатели, которые еще не установлены. После удаления всех объектов, отмеченных указателями, оба контейнера можно безопасно удалить.
Возвращаемое значение от insert
можно использовать для определения того, был ли введенный элемент новым или нет. Я не проверял следующее (или используется станд :: установить на некоторое время), но я думаю, что следующее права ...
if (myset.insert (pointervalue).second)
{
// Value was successfully inserted as a new item
delete pointervalue;
}
Вы не должны разрабатывать проекты так, что это необходимо, конечно же, но не так сложно справиться с ситуацией, если вы не можете этого избежать.
Не должно ли это работать? delete null указывается в стандарте, поэтому он разрешен и должен работать. Хорошо, это не лучший стиль кодирования ... –
@Mario: Удаление NULL задается как NO-OP, но вызов его накладывает некоторые накладные расходы. –
Задача q и p не будет NULL, поэтому будут двойные удаления. –