我有以下结构:
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/