gpt4 book ai didi

c++ - 从指针 vector 的 vector 中释放内存

转载 作者:行者123 更新时间:2023-11-28 07:41:03 24 4
gpt4 key购买 nike

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

我发现我的方法一次传播多个粒子很方便,因此该方法返回一个轨迹 vector ,每个轨迹是一个步长 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;
}

每个 Step 创建一个指向 TParticle 的指针 vector (使用 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。

最佳答案

将 vector 类型的 vector 更改为:

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

这会做一些事情。首先,它阻止复制你的 std::vector s around,这很糟糕,因为这样的 vector 表示所有权和对数据的引用。

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

其次,当vectorvector数据超出范围,unique_ptr自动清理 Step对象。

您可能需要插入一些 .get()调用 unique_ptr<Base>在你调用一个接受 Base* 的函数的情况下直接地。但除此之外,它应该大部分是透明的。

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

关于c++ - 从指针 vector 的 vector 中释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15863279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com