【问题标题】:C++ pointer assignment statement doesn't seem to work / do anythingC++ 指针赋值语句似乎不起作用/做任何事情
【发布时间】:2011-10-08 18:28:01
【问题描述】:

我在模板类(一个简单的 FIFO 队列)中有以下方法,在 GDB 调试时,我发现将指针“previous”重新分配给“current”的语句似乎什么也没做。 执行此语句时,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 的值从未使用过,所以编译器可能只是忽略了赋值?

标签: c++ pointers variable-assignment


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    尝试关闭所有优化。

    编译器很可能注意到 previous=current 不是必需的,只是将其编译出来

    【讨论】:

      【解决方案3】:

      因此,您永远不会使用您的 previous 变量,特别是如果您使用 gcc -O2 进行编译,它会被视为循环不变量,并且会被优化掉。

      【讨论】:

        【解决方案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)
        

        【讨论】:

        • 谢谢!我在这个函数的范围之外同时使用了当前和以前的。现在可以理解为什么以前从未设置过!
        猜你喜欢
        • 1970-01-01
        • 2016-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        • 2018-10-03
        • 2019-11-26
        相关资源
        最近更新 更多