当对象被分配给一个新的时,它们会调用它们的析构函数吗?

时间:2014-07-16 21:46:00

标签: c++ constructor garbage-collection destructor

具体使用此代码

function myfunction(){
  vector<T> foo,bar;
  //..put some objects into foo via push_back
  for(int i =0;i<foo.size;i++)
    if(foo[i].hasCondition())
      bar.push_back(foo[i]);
  foo = vector<T>();
  //do other stuff
}

foo或bar中没有包含的对象是否也被破坏了?如果不是,那么只能破坏foo中未被bar指向的对象的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您的用例的正确算法是copy_if

#include <algorithm>    // for copy_if
#include <functional>   // for mem_fn
#include <iterator>     // for make_move_iterator and back_inserter

auto it = std::make_move_iterator(foo.begin());
auto e = std::make_move_iterator(foo.end());

std::copy_if(it, e, std::back_inserter(bar), std::mem_fn(&T::hasCondition));

foo.clear();            // destroy what's left of them

(在make_move_iterator中包装迭代器允许您有效地移动元素而不是制作副本并立即销毁原文。请将其视为不存在的move_if算法的显式版本。)

答案 1 :(得分:1)

您可能希望按T存储std::shared_ptr类型的对象,而不是按值存储它们:

function myfunction(){
  typedef std::shared_ptr<T> TPtr;
  vector<TPtr> foo,bar;
  //..put some objects into foo via push_back and make_shared
  for(int i =0;i<foo.size;i++)
    if(foo[i]->hasCondition())
      bar.push_back(foo[i]);
  foo = vector<T>();
  //do other stuff
}

在您的代码中,您将基于foo将部分对象从bar复制到hasCondition(),并且foo中的所有对象在您分配{{1}时将被销毁}}