c++ - 用 std::shared_ptr 替换 vector 中的原始指针

标签 c++ pointers std shared-ptr stdvector

我有以下结构:

typedef Memory_managed_data_structure T_MYDATA;
std::vector<T_MYDATA *> object_container;
std::vector<T_MYDATA *> multiple_selection;
T_MYDATA * simple_selection;

编辑:这可能非常重要:Memory_driven_data_struct 包含,除其他外,一个指向其他数据的痛苦的原始指针。

它的目标是成为内存管理对象的原始容器(object_container)的非常简单的表示,然后是一个“multiple_selection”数组(用于选择范围内的许多对象并用它们进行各种操作)和一个“simple_selection”指针(用于对单个对象执行这些操作)。

所有对象的生命周期都由object_container管理,而multiple_selection和simple_selection仅指向其中的一些对象。 multiple_selection和simple_selection可以根据需要取消,并且只能删除object_container对象。

系统工作得很好,但我现在正在尝试进入shared_ptrs,并且想将结构更改为:

typedef Memory_managed_data_structure T_MYDATA;
std::vector<std::shared_ptr<T_MYDATA> > object_container;
std::vector<std::shared_ptr<T_MYDATA> > multiple_selection;
std::shared_ptr<T_MYDATA> simple_selection;

同样,对象容器将是“所有者”,其余的将仅指向它们。我的问题是,这个方案会对应用程序造成破坏吗?在像滚雪球一样进行这些变化之前,我应该了解一些事情吗?难道shared_ptr不是合适的指针类型吗?

我可以在某种程度上保证,如果对象首先不在 object_container 中,则 multiple_selection 或 simple_selection 中不会存在任何对象。当然,在 multiple_selection 或 simple_selection 中不会调用任何删除操作。

感谢您的宝贵时间。

编辑:忘了提及,以前从未使用过任何这些自动指针,所以我可能对它们的用途感到非常困惑。任何提示和经验法则将不胜感激。

最佳答案

您说,对象容器将是相关对象的“所有者”。在这种情况下,您有明确的所有权关系,使用 std::shared_ptr 并不理想。相反,坚持你所拥有的。

但是,如果您不能保证指针在被删除之前已从 multiple_selection 和/或 simple_selection 中删除,则必须采取行动。一种可能的操作是使用shared_ptr。在这种情况下,即使对象已从 object_container 中删除(通过 shared_ptr::reset 或仅分配 null 值),对象仍然可以继续存在于其中一个选择中。

另一种选择是确保对象被彻底删除:如果要删除某些内容,请从选择和 object_container 中删除对其的所有引用,然后删除它。如果您严格遵循此方案,则不需要shared_ptr的开销。

关于c++ - 用 std::shared_ptr 替换 vector 中的原始指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18202292/

相关文章:

c - 为什么 malloc 返回值不在进程内存映射中?

将 std::string 转换为 std::wstring 的 C++ 问题 - Windows 与 Linux

c++ - 方法指针的问题

c++ - 如果启发式函数 H 不是单调的,A* 算法是什么?

c++ - 图像类层次结构的设计建议

c++ - Boost::convex_hull 分散的二维点在 STL 容器中

c++ - 如何在编译时使用 std::make_tuple ?

c++ - 'inet_pton' : identifier not found

java - 为什么数组赋值不兼容,尽管它们的数据类型是兼容的?

c - C中的指针,指向字符指针的整数指针