存储unique_ptrs、shared_ptrs或 ID 的列表

Store list of unique_ptrs, shared_ptrs, or IDs?

本文关键字:ptrs ID 列表 unique 存储 shared      更新时间:2023-10-16

假设我有这样的类:

class Foo
{
public:
    Foo();
private:
    int id;
    //Other data...
    std::list< ??? > connected_foo;
}
class Bar
{
public:
    Bar();
private:
    std::list<std::unique_ptr<Foo> > all_foo;
}

在类 Foo 中,我创建了一个类似图的结构,以便一些Foo对象链接到其他Foo对象。

在C++11中,哪个最"正确"?具体来说,???应该是什么?unique_ptr列表 ?shared_ptr列表 ?还是int列表,带有循环访问all_foo并找到特定对象的函数?

还是我应该一起使用不同的数据结构(即map)?我知道 Boost 库提供图表,但这比我在这里寻找的要多一点(又名想坚持使用C++标准库)。

如果"正确"太模糊(可能是),请按顺序假设优先级是可读性、最不可能导致内存泄漏和简洁性。

几点说明:我对C++相当陌生(来自 C),所以我尽量不使用C++作为"C with OO"。在 C 语言中,我会使用一个指针数组,并很可能将其称为一天(特别是因为我知道在程序结束之前不会释放对象);无法创建unique_ptr的副本让我有点困惑。我在这里瞄准的具体应用是在逻辑门外创建一个电路(使用 OO)。这是一个(研究生)学校项目。

在不知道您的完整用例的情况下,可能不可能给出答案。但是,如果Bar真的拥有所有Foo并且会比所有都长寿(正如您在问题中所述),我会建议:

std::vector<Foo*> connected_foo;

原始指针没有错 - 我们不使用它们来传达任何所有权语义,只是观察。

拥有unique_ptr<Foo>容器是错误的 - Bar已经拥有独特的所有权。您可以使它们shared_ptr<Foo>(并将Bar更改为共享所有权)。这是正确的,但如果Bar真的拥有它们,那就没有必要了。相反,存储ID意味着进行查找的成本更高,因此我不确定这有什么好处。

如果您不打算在每次删除对象时遍历all_foo并清除所有对象中的引用,则可以使用 std::list<std:weak_ptr<Foo>> connected_foo; 并根据需要检查和更新connected_foo。然后,当您想在节点中使用连接的foo时,首先将其锁定以共享并检查它是否存在,如果不存在,则将其从已连接列表中删除。请注意,您必须为此保持std::list<std::shared_ptr<Foo>> all_foo。