从指针向量向量中释放内存

时间:2013-04-07 14:06:43

标签: c++ pointers memory vector

我正在创建一个粒子物理模拟器,我需要进行适当的内存管理。

我发现我的方法一次传播几个粒子很方便,所以这个方法返回一个轨迹矢量,每个轨迹都是一个步骤矢量(因此得到一个vector< vector<> >)。

(Step是我创建的一个课程。)

vector< vector<Step*> > Propagator::Propagate (vector<TParticle*> vpart) {
  vector< vector<Step*> > = vvsteps;
  //vvsteps goes through physics and gets filled using push_back
  //all of vvsteps' entries were filled with objects created with "new"

  return vvsteps;
}

每个步骤创建一个指向TParticle的指针向量(使用new创建),并使用以下析构函数来解除分配。

vector<TParticle*> vpart;

Step::~Step() {
  for(int i=0; i<vpart.size(); i++) delete vpart[i];
  vpart.clear();
}

在我得到我想要的东西后,我尝试通过以下方式解除分配:

vector< vector<Step*> > vvstep = prop->Propagate(vpart);

/*PHYSICS GOES HERE*/

for(int i=0; i<vvstep.size(); i++) {
  for(int j=0; j<vvstep[i].size(); j++)
    delete (vvstep[i])[j];
  vvstep[i].clear();
}
vvstep.clear();

此代码由于某种原因不起作用。它给我以下错误

*** glibc detected *** bin/rtest.exe: double free or corruption (fasttop): 0x0f7207f0 ***

编辑:更正了一个拼写错误,该类名为Step而不是Steps。

1 个答案:

答案 0 :(得分:1)

将矢量类型的矢量更改为:

`std::vector< std::vector<std::unique_ptr<Step>>>`

这做了一些事情。首先,它阻止复制你的std::vector,这很糟糕,因为这些向量代表了对数据的所有权和引用。

move仍然可用,通常应该发生。如果要将一组矢量矢量移动到另一个点,并且不会自动发生,请插入std::move( src )

其次,当vector数据的vector超出范围时,unique_ptr会自动清除Step个对象。

如果您正在调用直接使用.get()的函数,则可能必须在unique_ptr<Base>上插入一些Base*次调用。但它本来应该是透明的。

请注意,可能会发生双重删除,因为您复制了vector Base*的其中一个std::vector<std::unique_ptr<Base>> - {{1}}会在您尝试这样做时抱怨... < / p>