2

所以我在这里尝试实现一些内存管理技术。在我的程序中,我创建了一个 stl 列表,以便它包含“Blast”类的对象及其各自的迭代器:

list<Blast> blasts;
list<Blast>::iterator it1;

看了一圈发现,如果你使用erase函数,它会调用类的析构函数,然后删除它指向的对象的迭代器,并返回一些其他的指针(迭代器)。但是,如果类是 POD,那么对析构函数的调用将不会做任何事情,因此保存在该对象中的所有信息都将保存在内存中。

为了解决这个问题,我尝试动态分配对象,以便可以使用 delete 函数将其从内存中擦除:

Blast *blast;
blast = new Blast;

但是,在这里我遇到了一个问题。当我试图将对象推送到列表中时,它只允许我推送指针:

blasts.push_back(*blast);

起初,我什么都没想。所以我继续说:

if(it2->getX() > 600) {

   delete &it2;
   it2 = blasts.erase(it2);

   }

然后我意识到,它的作用是删除指向对象的指针,然后删除指向指向对象的指针的指针。

我不完全确定这是否真的正确,因为我无法知道是否存在内存泄漏。所以我的问题是:

在删除指向该对象的任何指针之前,我必须做什么才能从内存中擦除该对象?我的实现是否正确?结果和我只是简单地将对象推到列表上一样吗?

4

1 回答 1

1

然后删除它指向对象的迭代器并返回一些其他指针(迭代器)

不是指针,是迭代器。

因此,保存在该对象中的所有信息都将保存在内存中。

不,那不是真的。

当我试图将对象推送到列表中时,它只允许我推送指针:

嗯?如果您有 astd::list<Blast>那么您当然不能将 a 存储Blast*在列表中,那不是同一类型。也许您想将列表更改为std::list<Blast*>?

delete &it2;

这是错误的,它试图删除迭代器,而不是它引用的列表元素。要删除它指向您想要的元素:

delete &*it2;

但是如果你仍然有一个std::list<Blast>then 会尝试删除列表所拥有的对象,这将是非常错误的并且会导致错误。

我认为您应该坚持std::list<Blast>并忘记整个问题-这似乎是基于一种误解,即擦除元素不会破坏对象,这是不正确的。如果您的问题是Blast对象具有指向动态分配内存的指针成员,则添加一个析构函数以Blast使其正确清理。

于 2012-10-14T23:46:25.320 回答