C ++清除类析构函数

时间:2015-11-06 19:46:20

标签: c++ c++11

如果我将std::list定义的结构ABC(不是指向所述结构的指针)保存为class P中的类变量,并手动推送填充在P类的各种成员函数中的ABC变量< / p>

  • 我还需要在类的析构函数中执行list :: clear()吗?当从堆栈中删除/删除该类的对象时,无论如何都要删除列表中的结构?

  • 如果我维护一个指向所述结构的智能指针列表会更有效率(每次推回可能/可能不涉及复制 - 因为我们只是将指针存储在列表中)?

    < / LI>

3 个答案:

答案 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::vectorstd::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