как определить причину ошибки памяти - PullRequest
0 голосов
/ 09 ноября 2011

Я использую Visual Studio 2003, и у меня есть приложение на C ++, использующее Microsoft STL с ошибкой памяти:

код был:

instrcutions;
function1();
function2();
...
functionN();

Я изменил его:

list<A*> l1;
instrcutions;
function1();
function2();
...
functionN();

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

, так как функции "не знают"список существует, список нельзя изменить по назначению.я попытался изменить имя списка: происходит то же самое поведение.

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

Может ли кто-нибудь подтвердить, что Visual Studio не может обнаружить неправильный доступ к памяти, как я описал?

Ответы [ 5 ]

0 голосов
/ 10 ноября 2011

список l1;насколько я помню, список содержит его размер для быстрой работы функции .size (), это можно использовать.

Я просто не помню, поддерживает ли vs2003 точки останова при записи в память.VS2005 - определенно делает.

Так что идея: получить адрес члена 'size' внутри списка (найти его, открыв файл заголовка) и установить точку останова при изменении данных.Тогда вы поймаете нарушителя в любом случае, тем не менее, это обычный скрытый push_back или запись в случайную стековую память, где представлен сам объект std :: list.

0 голосов
/ 09 ноября 2011

Содержание списка - это указатели на объекты типа A, однако ... это предположение, потому что ваша проблема кажется очень общей, вы думали о том, что объект списка не является указателем, поэтому при создании ваших объектов для передачи в объект списка , Этот объект списка больше не существует, потому что вы поместили его дальше в стек. Возможно, сделайте ваш список объектов ..

 list<A*>* l1;
0 голосов
/ 09 ноября 2011

Задайте себе следующие вопросы:

  1. Сохраняются ли указатели в list, указывающие на объекты в куче или в стеке?
  2. Вы delete используете или free используете указатели в list, и соответствуют ли распределения освобождению?
  3. Вам действительно нужны указатели или вы можете просто использовать типы значений?

Вы можете использовать shared_ptr вместо необработанного указателя, если у вас возникают проблемы с отслеживанием # 2 (хотя убедитесь, что у вас нет циклических ссылок).

0 голосов
/ 09 ноября 2011

Я не уверен, что понимаю ваш вопрос - вы вообще изменяете список? Передача его в какие-либо функции?

Если вы уверены, что где-то перезаписываете память, попробуйте использовать функцию _heapchk () во время работы в режиме отладки. Я успешно использовал его для обнаружения перезаписи памяти, заключив важные выражения в std :: couts и вызывая _heapchk ():

std::cout << "Loc 0" << std::endl;
callFunction(parameter);
_heapchk();
std::cout << "Loc 1" << std::endl;

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

0 голосов
/ 09 ноября 2011

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

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