这是我的清单
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();
有没有更好的方法?感谢
答案 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_ptr
,delete
会在不再需要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()以清除列表之前,您确实需要显式释放列表中的每个元素。释放指针。