【问题标题】:Deleting objects in an stl list using the erase function in c++使用 C++ 中的擦除函数删除 stl 列表中的对象
【发布时间】:2012-10-14 20:50:07
【问题描述】:

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

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

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

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

Blast *blast;
blast = new Blast;

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

blasts.push_back(*blast);

一开始,我并没有想太多。所以我继续说:

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

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

   }

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

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

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

【问题讨论】:

    标签: list memory stl memory-leaks erase


    【解决方案1】:

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

    不是指针,而是迭代器。

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

    不,那不是真的。

    当我尝试将对象推送到列表中时,它只让我推送指针:

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

    delete &amp;it2;

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

    delete &*it2;
    

    但如果你还有一个std::list&lt;Blast&gt;,那么它会尝试删除列表所拥有的对象,这将是非常错误的并且会导致错误。

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

    【讨论】:

    • 感谢您解决这个问题。因为这个帖子,我真的觉得擦除功能没有破坏对象:link
    • 检查接受的答案 - 这是未定义的行为,因此打印任何内容(包括 2 个)都是有效结果。该对象被erase 销毁,但这并不意味着它曾经存在的内存被清零,只是对内存不做任何事情会更快,让它变脏直到它被重用。
    猜你喜欢
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2019-10-08
    • 1970-01-01
    相关资源
    最近更新 更多