编程文汇

c++ foreach 循环变量的值传递和引用传递

今天些代码的时候,遇到一个很奇怪的问题:

    std::vector<Estr> acc{};
    format_param_acc(acc, args...);
    std::vector<Impl *> ptrargs{};
    for (auto one : acc)
    {
      auto prt = one.internal_.getImpl().get();
      ptrargs.push_back(prt);
    }
   。。。。。。
   后面要使用 ptrargs

然而使用ptrargs的时候,发现里面的内容被释放了,ptrargs存放的指针指向acc数组,很明显没有释放。我第一反应是我写的Estr移动、复制出了问题,排查了一遍,没问题。

后来突然想到是在for循环结束后释放的,而 auto one是个局部克隆,每次循环都释放。

    for (auto &one : acc)
    {
      auto prt = one.internal_.getImpl().get();
      ptrargs.push_back(prt);
    }

把代码改成如上auto &one,这时one变成了引用,所有权还在acc,就不会释放。

这是个很低级的错误。不过,却很好的演示了foreach循环的特性,循环量的“值传递”和“引用传递”,如果误用的话,就很可能出现意外的bug。