Есть ли установленное значение указателя для освобожденного pointee? - PullRequest
6 голосов
/ 20 января 2011

Некоторым программистам нравится устанавливать нулевую переменную указателя после освобождения указателя:

delete ptr;
ptr = 0;

Если кто-то попытается снова освободить указатель, ничего не произойдет.На мой взгляд, это неправильно.Доступ к указателю после освобождения pointee является ошибкой, и ошибки должны появиться у вас как можно скорее.

Есть ли альтернативное значение, которое я мог бы назначить переменной указателя, которая обозначает освобожденных pointees?

delete ptr;
ptr = SOME_MAGIC_VALUE;

В идеале я бы хотел, чтобы Visual Studio 2008 сообщала мне « Программа была прервана, потому что вы пытались получить доступ к уже выпущенному pointee здесь! » в режиме отладки.


Ладно, похоже, я должен сделать проверку сам.Что-то не так со следующим шаблоном?

template <typename T>
void sole_delete(T*& p)
{
    if (p)
    {
        delete p;
        p = 0;
    }
    else
    {
        std::cerr << "pointee has already been released!\n";
        abort();
    }
}

Ответы [ 12 ]

0 голосов
/ 20 января 2011

Установка указателя на конкретное значение повлияет только на эту копию указателя, поэтому она практически не обеспечивает защиту.Если программа нуждается в проверке правильности, существуют классы интеллектуальных указателей, которые отслеживают копии указателя и делают их недействительными, в противном случае я бы просто рекомендовал такой инструмент, как Valgrind (в Linux) или Rational Purify (в Windows), который позволит вам проверитьдля ошибок доступа к памяти.

0 голосов
/ 20 января 2011

В C ++ 0x вы можете

delete ptr;
ptr = nullptr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...