C ++ векторная отладочная реализация - PullRequest
3 голосов
/ 18 января 2011

Во время изучения c ++ я прошел через изучение того, что такое итераторы и как их использовать. Затем я испытал боль от изучения того, что вызывает функция, делает недействительными итераторы и быстро обнаружил их. В последнее время я следил за вопросами и заметил, что очень распространенная тема - это люди, которые не понимают, что вызов vector::erase() делает недействительными итераторы. Это заставило меня задуматься, существует ли реализация отладки из vector, которая runtime проверяет на достоверность вектора?

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

Это поможет диагностировать более неясные ошибки, когда вызов erase() вложен (случайно или неосознанно) глубоко в вызов функции, в то время как тот же самый вектор находится в процессе итератора.

Кто-нибудь знает о такой реализации или по каким-либо причинам, почему ее не следует использовать?

РЕДАКТИРОВАТЬ: я использую Linux и G ++.

Ответы [ 2 ]

4 голосов
/ 18 января 2011

Реализация Microsoft выполняет некоторую проверку отладки ( ref и ref ). Он специально проверяет диапазон, поэтому я не уверен, подходит ли сценарий erase () или нет.

Изменить для вклада Джальфа:

Похоже, что GCC (и g ++) имеет схожую функциональность:

stackoverflow.com / questions / 2567997 / и

gcc.gnu.org / onlinedocs / libstdc ++ / ручной / debug_mode.html

0 голосов
/ 18 января 2011

Это найдено в реализации библиотеки Microsoft STD ..

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

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