如果我将std::list
定义的结构ABC(不是指向所述结构的指针)保存为class P
中的类变量,并手动推送填充在P类的各种成员函数中的ABC变量< / p>
我还需要在类的析构函数中执行list :: clear()吗?当从堆栈中删除/删除该类的对象时,无论如何都要删除列表中的结构?
如果我维护一个指向所述结构的智能指针列表会更有效率(每次推回可能/可能不涉及复制 - 因为我们只是将指针存储在列表中)?
< / LI>答案 0 :(得分:3)
至于需要list::clear()
查看其他答案。我应该补充一点,如果ABC
的析构函数没有其他明确的工作要做,你可以省略它,编译器会自动为你生成它。
关于填充列表的方法。您希望避免大数据的深层副本。这可以通过moving
来实现std::list<ABC> list;
ABC big(data_needed_for_constructing_ABC);
list.push_back(std::move(big));
如果class ABC
有一个有效的移动构造函数(如果内存管理使用std::vector
或std::unique_ptr
等标准功能,则可能是自动的。
您也可以将新的列表元素直接构建到列表中
std::list<ABC> list;
list.emplace_back(data_needed_for_constructing_ABC);
当没有临时对象ABC big
时。
最后,如果您无法有效地移动对象,并且希望在其他位置拥有该对象的另一个副本,则可以考虑std::list<std::shared_ptr<ABC>>
。但是,如果没有明确的所有权,这是明智的。
答案 1 :(得分:1)
您不需要明确地打电话。 std::list
的析构函数会自动处理。
切换到指针的性能是更好还是更差取决于ABC
数据类型的大小。如果它很大,复制是昂贵的。在这种情况下,避免复制应该可以提高性能。另一方面,如果对象很小,最好复制它们。
答案 2 :(得分:0)
如果你的类包含一个列表作为数据成员,那么当类的一个对象被销毁时,std::list
的析构函数将被自动调用,反过来将销毁它的所有元素。
您无需在类的析构函数中调用其方法clear
。