Могу ли я отловить ошибки указателя в C ++? - PullRequest
9 голосов
/ 18 июня 2010

Мне было интересно, есть ли возможность отлавливать такие ошибки в C ++:

object* p = new object;

delete p;
delete p; // This would cause an error, can I catch this?
  1. Могу ли я проверить правильность указателя?
  2. Могу ли я поймать какое-то исключение?

Я знаю, что мог бы установить указатель p на NULL после первого удаления объекта. Но только представьте, что вы этого не сделаете.

Ответы [ 4 ]

10 голосов
/ 18 июня 2010

Я не думаю, что вы можете поймать такую ​​ошибку, потому что я думаю, что результатом является неопределенное поведение. Это может ничего не делать, это может привести к сбою, это может просто повредить память и вызвать проблему позже.

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

Было предложено установить указатель на ноль, но я думаю, что было бы лучше использовать умные указатели, а не удалять их вообще.

2 голосов
/ 18 июня 2010

Почему никто не хочет использовать умные указатели, такие как boost::shared_ptr? Если вы используете его, вы можете забыть delete -оператор. ;)

1 голос
/ 18 июня 2010

Вы можете перехватить эти ошибки с помощью любого отладчика памяти, такого как BoundsChecker или Purify в Windows и Valgrind в Linux.

1 голос
/ 18 июня 2010

К сожалению, я не могу говорить за мир Windows, но я знаю, что в мире Unix есть некоторые инструменты, которые делают это для вас (во время выполнения)

Идея состоит в том, чтобы реализовать функции выделения памяти вместе с некоторыми дополнительными проверками. Библиотеке может быть приказано прервать процесс при обнаружении проблемы, и вы можете найти проблему, посмотрев трассировку стека. libumem на солярисе - один из примеров этого.

Я уверен, что на платформе Windows должны быть похожие вещи.

Существуют и другие инструменты, выполняющие статический анализ кода, которые помогут вам найти проблемы перед запуском кода. Coverity - один из примеров, и я думаю, что он работает и на Windows. Нам удалось найти немало потенциальных проблем с укрывистостью. К сожалению, это не бесплатно. Оценочные версии должны быть возможны, хотя.

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