Как обнаружить и изолировать C ++ Access Violation Error - PullRequest
1 голос
/ 28 декабря 2010

Когда я разрабатывал приложение на C ++,

я использовал простой list<int> *somelist = new list<int>();, содержащий данные.

Я пытался перебрать этот список, используя что-то вроде этого:

for (list<int>::iterator j=somelist->begin();j!=somelist->end();j++)
{
    //do something with *j
}

Когда я что-то делал с указателем j из-за цепной реакции данных, на которые я собиралсядоступ был удален из списка и больше не существует.

Итак, мне выдается сообщение об ошибке нарушения прав доступа.

Может кто-нибудь сказать мне, как определить, является ли указатель j плохим ptr

Ответы [ 3 ]

1 голос
/ 28 декабря 2010

Ошибка в вашем коде заключается в том, что вам нужно справиться с этим, когда вы все еще знаете, что удалили его.После этого вы не можете справиться с этим больше.В следующем примере dosomething возвращает true, когда элемент должен быть удален

for (list<int>::iterator j=somelist->begin();j!=somelist->end();) {
   if(dosomething(j)) {
     /* should remove it! */
     j = somelist->erase(j);
   } else {
     ++j;
   }
}
1 голос
/ 28 декабря 2010

Не может быть сделано.Вы не должны удалять список во время обхода.

0 голосов
/ 28 декабря 2010

При многопоточности ваш итератор может стать недействительным, если какой-то другой поток удалит элементы из списка.При низкоуровневом программировании, таком как C ++, невозможно обнаружить эту проблему после ее возникновения.Лучше всего: « предотвратить это

Использовать функции синхронизации (например, WaitForSingleObject в Windows) для управления доступом к общим контейнерам STL.

...