如何正确删除列表中的对象?

时间:2016-04-28 01:29:38

标签: c++ list

这是我的清单

list<DisplayableObject> objects;

我想在其中添加新的可显示对象

我希望函数能够完全释放列表并将其删除

我已经看过擦除,清除等但是当我在线阅读时,人们说我需要明确地这样做,因为那些类功能实际上不会释放内存吗?

我做了一些方法,不知道它们是否正确:

iter = objects.begin();

1

while (!objects.empty()) {
    objects.remove(*iter);
}
objects.clear();

2

while (!objects.empty()) {
    delete &objects.front();
    objects.pop_front();
}
objects.clear();

3

while (!objects.empty()) {
    delete &iter;
    iter++;
}
objects.clear();

有没有更好的方法?感谢

2 个答案:

答案 0 :(得分:2)

你正在混淆两件不同的事情。让我们取std::list个整数指针,然后像这样初始化它们:

std::list<int *> list;

list.push_back(new int[7]);
list.push_back(new int[5]);

此时,做一个

list.clear();

将完全删除列表中的元素。但是,列表中的元素是指向整数的指针,它与它们指向的实际数据完全分开。数据未被释放。您有责任事先delete[]

for (auto &item:list)
      delete[] item;
list.clear();

std::list仅负责删除列表中的值。 std::list不了解指针(如果列表包含指针)指向的内容。例如,使用完全相同的列表:

std::list<int *> list;

int a;
int b;
list.push_back(&a);
list.push_back(&b);

此列表本身与第一个列表完全相同。它仍然是整数指针的列表。在这种情况下,

list.clear();

这是唯一需要做的事情。指针不是new - ed对象的指针。作为C ++开发人员,您有责任跟踪new ed以及delete不再需要的内容。

这就是为什么你不想使用原始的,纯粹的,无掺杂的指针,除非绝对必要。相反,您希望使用std::shared_ptrdelete会在不再需要new ed对象时自动class SomeClass {}; std::list<SomeClass *> list; 。如果,而不是

std::list<std::shared_ptr<SomeClass>> list;

你用过

int

(在这里使用一个类,而不是list.clear(); ,以获得更好的例子);那么当你

delete

然后,如果指向的类成员不再被任何其他智能指针引用,它们将自动*(uint16_t*)a d。

答案 1 :(得分:1)

您所要做的就是调用objects.clear()。您的列表由对象组成(我假设DisplayableObject只是一个对象而不是指针),因此将调用每个对象的析构函数,列表将为空。

现在,如果您已经存储了列表中对象的简单指针,而不是简单地存储对象,那么在调用objects.clear()以清除列表之前,您确实需要显式释放列表中的每个元素。释放指针。