Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确删除列表中的对象?_C++_List - Fatal编程技术网

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

C++ 如何正确删除列表中的对象?,c++,list,C++,List,这是我的名单 list<DisplayableObject> objects; 一, 二, 三, 有没有更好的办法?谢谢您只需调用objects.clear()。您的列表由对象组成(我假设DisplayableObject只是一个对象而不是指针),因此将调用每个对象的析构函数,列表将为空 现在,如果您在列表中存储了指向对象的简单指针,而不是简单地存储对象,那么您确实需要在调用objects.clear()之前显式释放列表中的每个元素,以清除已释放指针的列表。您的操作将两个不同的事情

这是我的名单

list<DisplayableObject> objects;
一,

二,

三,


有没有更好的办法?谢谢

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


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

您的操作将两个不同的事情混为一谈。让我们使用一个<代码> STD::整数指针的列表< /代码>,并将它们初始化如下:

std::list<int *> list;

list.push_back(new int[7]);
list.push_back(new int[5]);
将完全删除列表中的元素。但是,列表中的元素是指向整数的指针,它与它们所指向的实际数据完全不同。数据未被释放。您有责任事先删除[]

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);
是这里唯一需要做的事情。指针不是指向
新的
-ed对象的指针。作为C++开发人员,在不需要的时候,跟踪你的<代码>新< /COD> ED,以及<代码>删除>代码>是你的责任。
这就是为什么您不想使用原始的、简单的、未经修饰的指针,除非这是绝对必要的。相反,您希望使用
std::shared_ptr
,当不再需要
新对象时,它将自动
删除
新对象。如果,而不是

class SomeClass {};

std::list<SomeClass *> list;

然后,如果指向的类成员不再被任何其他智能指针引用,它们将自动
delete
d.

你说的“我不知道它们是否正确”是什么意思。先检查尺寸,后检查尺寸?您是否尝试过先打印对象,然后再打印对象,以查看是否删除了正确的对象?我不知道是否正确释放了内存,或者是否有更简单的方法来执行此操作?您的意思是
std::list
?然后只需
clear()
。这会释放内存吗?我一直认为每一个新的需要一个合适的删除答案取决于什么是
DisplayableObject
。班级类型?智能指针?一个原始指针?对不起,我要删除这个问题,因为它很愚蠢。感谢您为我澄清这一点,我最好使用
unique\u ptr
而不是
shared\u ptr
,除非您确实需要共享所有权-后者会导致维护引用计数的开销。非常感谢,非常有帮助
std::list<int *> list;

list.push_back(new int[7]);
list.push_back(new int[5]);
list.clear();
for (auto &item:list)
      delete[] item;
list.clear();
std::list<int *> list;

int a;
int b;
list.push_back(&a);
list.push_back(&b);
list.clear();
class SomeClass {};

std::list<SomeClass *> list;
std::list<std::shared_ptr<SomeClass>> list;
list.clear();