【问题标题】:Do objects call their destructor when they are assigned to a new one?当对象被分配给一个新的对象时,它们会调用它们的析构函数吗?
【发布时间】:2014-09-07 14:31:53
【问题描述】:

具体取这段代码

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 未指向的对象的正确方法是什么?

【问题讨论】:

  • 简短回答:是的。尽管在这种情况下bar 包含对象的副本,所以当它被销毁时,您将获得对析构函数的第二次调用。
  • 这里使用的临时实例foo = vector&lt;T&gt;();会在使用后销毁,是的。
  • 不是复制单独的对象实例吗?所以 destruct 调用不是在两个不同的对象上吗?
  • @user2268997 是的,这就是我的意思。

标签: c++ constructor garbage-collection destructor


【解决方案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 算法的显式版本。)

【讨论】:

    【解决方案2】:

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

    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
    }
    

    在您的代码中,您将基于hasCondition()foo 中的一些对象复制到bar,并且当您分配foo = vector&lt;T&gt;() 时,foo 中的所有对象都将被销毁

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 2019-12-31
      相关资源
      最近更新 更多