Является ли это недействительным & (* _ shmItr) == NULL, где _shmItr является итератором списка - PullRequest
2 голосов
/ 22 ноября 2010
&(*_shmItr) == NULL

это довольно нубский вопрос, но я новичок в C ++.

в GCC 3.1.2, когда вы проверяете _shmItr == NULL, это прекрасно, но в GCC 4.2.2 этоошибка.Я сделал гугл об ошибке.они говорят, что разыменование и повторная ссылка решат проблему.и сделал.Я был счастлив.Но, как я узнаю больше об итераторе.Я чувствую, может быть, это передает ошибку, но не является допустимым и может дать проблемы во время выполнения.Что вы мне предлагаете ...

Я провел небольшое исследование и обнаружил, что

_shmItr == _shmItr.end()

Также служит той же цели и более правильно.пожалуйста, поправьте меня, если я ошибаюсь.

В основном мы пытаемся проверить, содержит ли _shmItr что-то недействительное или нет.перед выполнением любой операции.

Заранее спасибо.

Вот фрагмент кода

_shpmtItr = _shpmtList.begin();

if(_shpmtItr == NULL)
{
   eaLogMsg << setid("APP_FAILED")
            << "_shpmtItr is NULL in some::few()"
            << endl;

   return APP_FAILURE;
}

Это может рассказать вам сценарий.статический

1 Ответ

2 голосов
/ 22 ноября 2010

Определенно используйте list::end, если вы проверяете, прошли ли вы до конца списка. Нет никакой гарантии, что следующий элемент после прохождения каждого элемента в списке будет NULL. Он не скажет вам, является ли элемент, на который указывает указатель, действительным. Вот как я бы использовал list::end, если бы проверял, верны ли мои результаты:

list<whatever>::iterator item = find( myList.begin(), myList.end(), value );
if( item != myList.end() )...

Поскольку find возвращает последний элемент в диапазоне, который вы дали ему для поиска, если элемент не существует.

Тем не менее, когда вы делаете &(*something), вы получаете адрес элемента, на который указывает итератор, и который является абсолютно корректным кодом. Если вы ожидаете, что недействительные элементы будут иметь значение NULL, тогда это работает для ваших целей. Если вы не знаете, будут ли они НЕДЕЙСТВИТЕЛЬНЫМИ, это другая история.

Так какой код вы используете? Возможно, это поможет нам лучше ответить на ваш вопрос.

Edit:

Смотреть на ваш код и видеть, что вы используете list::begin(), а затем проверять его по NULL - это плохо, если ваш список не является списком указателей (или объектов, подобных указателю, таких как shared_ptr.). Я бы порекомендовал вам использовать list::empty чтобы увидеть, пустой ли список, а не myList.begin() != myList.end(). Смысл этого кристально ясен и его будет легче поддерживать в будущем.

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