C ++ оператор присваивания указателя, похоже, не работает / ничего не делает - PullRequest
4 голосов
/ 19 июля 2011

У меня есть следующий метод в шаблонном классе (простая очередь FIFO), и во время отладки GDB я обнаружил, что оператор переназначения указателя «предыдущий» на «текущий», похоже, ничего не делает. предыдущий начинается как NULL, а текущий не равен NULL, когда выполняется этот оператор, но предыдущий остается как NULL. Кто-нибудь видел что-нибудь подобное раньше?

inline int search(QueueEntry<T> *current,QueueEntry<T> *previous, unsigned long long t)
{
  while(current && !(current->getItem()->equals(t)))
  {
    previous = current; //**this line doesn't seem to work**
    current = current->getNext();
  }
  if(current)
    return 1;
  return 0;    
}

Ответы [ 4 ]

6 голосов
/ 19 июля 2011

Назначение оптимизируется компилятором, поскольку оно не влияет на поведение функции. Вы передаете previous каждый раз через цикл, но больше ничего не делаете с ним.

Ошибка, если есть, в остальной части функции.

4 голосов
/ 19 июля 2011

Где вы проверяете значение previous?Если вы выполняете это в этой функции, после назначения убедитесь, что в сборке отключены оптимизации, а затем повторите попытку.

С другой стороны, если вы смотрите previous снаружиобласть действия этой функции, тогда она никогда не будет изменена.При вызове search() копия указателя previous загружается в стек, и вы изменяете эту копию.Модификация исчезает после выхода из функции.Чтобы сохранить изменения, сделайте что-то вроде этого:

inline int search(QueueEntry<T> *current,QueueEntry<T> **previous, unsigned long long t)
{
    ...
    *previous = current;
    ...
}

При вызове search() теперь нужно будет передать адрес указателю вместо значения.

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

inline int search(QueueEntry<T> *current,QueueEntry<T> *&previous, unsigned long long t)
1 голос
/ 19 июля 2011

Вы никогда не используете переменную previous, поэтому, особенно если вы компилируете с gcc -O2, она считается инвариантом цикла и оптимизируется.

0 голосов
/ 19 июля 2011

Попробуйте отключить все ваши оптимизации.

Вероятно, компилятор замечает, что предыдущий = текущий не требуется, и просто компилирует его

...