Представляемая вами идиома обычно обозначается как Безопасное удаление .
Она уже была известна в C (хотя в то время это была free
): обнулитьуказатель, который вы только что освободили / удалили, чтобы избежать этого дважды.
Проблема в том, что вы обнуляете текущий указатель , но любая его копия по-прежнему указывает на ту же область памяти, которая теперьсодержит мусор.
Работа с памятью - сложная тема, фундаментальная концепция - владение .В любой момент времени владельцы определенной зоны памяти должны быть четко определены, и они должны нести ответственность за их возврат в систему, когда это необходимо.
Первый шаг в этомНаправление - это использование умных указателей, например std::unique_ptr
или boost::scoped_ptr
.Для совместного владения (только для экспертов) std::shared_ptr
может пригодиться, но вы еще не пришли.
Если вы пишете delete
в своем коде, это означает, что вы подвергаете себя утечкам.Это само по себе неплохо, но требует тщательного анализа и делает код хрупким (то есть может сломаться при изменении).В вашем случае:
int main() {
boost::scoped_ptr<int> i(new 5);
foo(*i);
} // memory returned to system by ~scoped_ptr()