Поймать все недопустимое использование памяти? - PullRequest
2 голосов
/ 05 апреля 2011

В Visual C ++ иногда, когда ресурс был уничтожен, он все еще может быть «доступен» через что-либо, указывающее на эту область памяти (хотя и очень ненадежно / стабильно). Есть ли способ заставить VC ++ возвращать исключение / сообщение / и т.д. что бы предупредить от такого нестабильного использования?

Например:

int *c = new int(5);
delete c;
std::cout << *c << std::endl; // will execute, however the value is likely to be invalid

По слегка связанному вопросу, системы Linux испытывают такую ​​же проблему, или это приведет к segfault?

Ответы [ 3 ]

6 голосов
/ 05 апреля 2011

Не используете сырые указатели? Использование shared_ptr / unique_ptr или стандартных контейнеров или контейнеров для повышения ptr действительно уменьшит ваши проблемы new / delete. Также пересмотрите свой дизайн и постарайтесь свести к минимуму паутину указателей между объектами, насколько это возможно. Используйте weak_ptr, когда можете.

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

РЕДАКТИРОВАТЬ: Это неопределенное поведение, поэтому системы Linux снова могут или не могут получить segfault.

EDIT2: Согласно http://msdn.microsoft.com/en-us/library/2f7sy2e9%28v=vs.80%29.aspx вы определяете _DEBUG в сочетании с использованием библиотеки CRT отладки для включения функций кучи отладки.

Изначально я не упоминал Purify из-за его стоимости, но в прошлом мне очень повезло с ним.

0 голосов
/ 05 апреля 2011

Доступны сторонние инструменты: для Visual C ++ есть Purify (но он дорогой) и, возможно, некоторые другие инструменты. (В Linux есть Valgrind, но я не думаю, что он доступен для Windows.) Кроме этого, дизайн - ваш лучший друг. C ++ не требует, чтобы вы использовали столько указателей, и использование должно быть частью вашего дизайна.

0 голосов
/ 05 апреля 2011
int *c = new int(5);
delete c;
c = null;  //add this
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...