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

时间:2011-07-19 17:59:08

标签: c++ pointers variable-assignment

我在模板类(一个简单的FIFO队列)中有以下方法,在进行GDB调试时,我发现将指针'previous'重新分配给'current'的语句似乎什么也没做。 执行此语句时,之前的启动为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 个答案:

答案 0 :(得分:6)

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

该错误(如果有的话)在函数的其余部分。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

因此,您永远不会使用previous变量,尤其是在您使用gcc -O2进行编译时,它被视为循环不变量,并且已经过优化。

答案 3 :(得分:0)

尝试关闭所有优化功能。

编译器可能注意到前一个=当前不需要做,只是编译出来