std :: for_each和std :: vector析构函数调用

时间:2016-07-13 07:23:13

标签: stl c++03

我对std :: for_each和一个仿函数代理对象有以下问题。 请参阅以下代码:

struct Functor {

  std::vector<int> data;

  const unsigned mID;
  static unsigned id;

  Functor() : mID(id++) {
     std::cout << "Functor constructed with id: " << mID << std::endl;
  }

  ~Functor() {
    std::cout << "Functor dtor: " << mID << std::endl;
  }

   void operator() (int i) {
      std::cout << "Functor print: " << i << std::endl;
      data.push_back(i);

      std::cout << "Dump: ";
      for(int i = 0; i < data.size(); ++i)
        std::cout << data[i] << " ";
      std::cout << std::endl;
   }
};
unsigned Functor::id = 0;

从上面来看,代理对象只做两件事,它将数据输出到CMD并存储一个供自己使用的副本。下面是对象的示例用例:

int main () {

  std::vector<int> intvec;
  for(int i = 0; i < 10; ++i)
    intvec.push_back(i);

  Functor myfunctor;
  std::for_each(intvec.begin(), intvec.end(), myfunctor);

  std::cout << "Data in my functor: " << myfunctor.data.size() << std::endl;
  for(int i = 0; i < myfunctor.data.size(); ++i)
    std::cout << "myfunctor data: " << myfunctor.data[i] << std::endl;

  return 0;
}

这对我来说真的很可疑。生成的输出是我的仿函数代理对象构造一次但解构三次!有些事情绕过了施工电话。

同样,由于在std :: for_each结束时调用析构函数,Functor.data也是空的!

有没有办法确保Functor中的数据保持持久性?我希望在std :: for_each(基本上任何可以接受一元仿函数的std算法函数)中使用函数时跟踪我的仿函数的状态。

请注意我只使用c ++ 03。非常感谢。

1 个答案:

答案 0 :(得分:1)

  

[...]我的仿函数代理对象构造一次但解构三次!有些事情绕过了施工电话。

不完全。您的类是默认构造一次,但也是复制构造两次。您不记录复制结构,因此它不会显示在您的输出中。

如果添加日志拷贝构造函数,您将看到“使用id:0构造的Functor”三次打印:

  Functor(const Functor& other) : mID(other.mID) {
     std::cout << "Functor constructed with id: " << mID << std::endl;
  }