C++指针赋值语句似乎不起作用/做任何事情



我在模板类(一个简单的FIFO队列)中有以下方法,而GDB调试时,我发现将指针"先前"重新分配给"当前"的语句似乎什么也不做。在执行语句时,previous开始为NULL, current不为NULL,但previous仍然为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;    
}

赋值被编译器优化掉了,因为它对函数的行为没有任何影响。每次通过循环时都重新分配previous,但对它不做任何其他操作。

如果有错误,则在函数的其余部分。

您在哪里检查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)

您永远不会使用previous变量,因此,特别是在使用gcc -O2编译时,它被认为是循环不变量,并且被优化掉了。

尝试关闭所有优化。

很可能是编译器注意到previous=current不是必须的,所以直接编译出来了

最新更新