0

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

我发现我的方法一次传播几个粒子很方便,所以这个方法返回一个轨迹向量,每个轨迹是一个 Steps 向量(因此得到 a 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;
}

每个 Step 创建一个指向 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。

4

1 回答 1

1

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

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

这做了几件事。首先,它会阻止复制您std::vector的 s,这很糟糕,因为这样的向量代表所有权和对数据的引用。

move仍然可用,并且通常应该发生。如果您想将一组向量向量移动到另一个位置,并且它不会自动发生,请插入一个std::move( src ).

其次,当数据超出范围时,会vector自动清理对象。vectorunique_ptrStep

在调用直接采用 a 的函数的情况下,您可能必须插入一些.get()调用。但否则它应该是透明的。unique_ptr<Base>Base*

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

于 2013-04-07T15:10:11.517 回答