Я могу зафиксировать ошибки неверного указателя в C++?

Я задавался вопросом, существует ли возможность зафиксировать ошибки как это в C++:

object* p = new object;

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

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

9
задан Unihedron 11 August 2014 в 09:50
поделиться

4 ответа

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

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

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

10
ответ дан 4 December 2019 в 14:26
поделиться

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

1
ответ дан 4 December 2019 в 14:26
поделиться

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

2
ответ дан 4 December 2019 в 14:26
поделиться

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

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

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

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

1
ответ дан 4 December 2019 в 14:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: