我应该在主要不是容器上使用shared_ptr或weak_ptr吗?

Umu*_*ood 9 c++ smart-pointers c++11

我有两个标准容器.它们都指向相同的数据结构.第一个包含所有数据,第二个包含一些相同的数据.我应该使用shared_ptrweak_ptr在第二个容器上?

首先,当我阅读我想unique_ptr在第一个集合上使用的参考时.我的第一个集合包含所有数据,它是唯一一个"拥有"的数据.这意味着如果数据不存在,则应将其删除.但是当我尝试创建第二个集合时,我不知道该怎么做.我创建了一个唯一的指针,但现在我需要另一个指向同一元素的指针来破坏唯一性,但事实上真正的所有者并不是新的指针.所以我理解(我希望我没有错),唯一性是在达到元素的方式而不是(例如)删除元素的可能性.所以,shared_ptr.我在他的第一个系列中有它们.但是现在第二个出现了,我想用了shared_ptr这里也.访问相同数据的方式可能都是,因此所有者是两个.但在我的情况下,数据总是从之前的第二个删除.如果我使用a weak_ptr,所有者的数量不会增加.在这两种情况下,当第一个集合需要时,元素将被删除.最后我正在使用shared_ptr因为weak_ptr我需要lock()每行代码中的每个指针,使其可读性降低.但我应该真正使用什么?

Gal*_*lik 11

这听起来并不像您需要,std::shared_ptr因为您的数据属于一个地方.

我建议std::unique_ptr在拥有容器中使用,然后简单地将原始指针放在第二个和后续容器中.

这是有效的,因为您永远不会删除原始指针,但它们指向的数据仍然由智能指针管理,因此当您不再需要它时将会释放它们.

尽管有一些不好的新闻,但原始指针在被用作非拥有访问者的数据时非常值得尊重,这些数据由其他实体拥有,并会在适当的时候删除它.

  • @jbruni你可以使用不完整类型的`std :: uique_ptr`,只要你避免某些操作.对于不同的操作,`std :: shared_ptr`也是如此.http://stackoverflow.com/a/6089065/3807729 (4认同)

Nir*_*man 5

您尚未提供关键信息,即您是否可以保证两个集合的生命周期相同.如果你可以保证两个集合具有相同的生命周期,那么使用unique_ptr来拥有所有东西的集合和另一个集合的原始指针(如@Galik建议的那样)是理想的.

如果你不能保证两个生命周期匹配,那么你是为两者选择shared_ptr还是为第一个选择shared_ptr而为第二个选择弱则取决于你希望何时销毁对象.听起来只有第一个系列是真正的拥有者,所以你需要弱指针.

但是,我强烈建议你坚持使用第一种方法.避免使用shared_ptr和weak_ptr会更清晰.危险在于,如果你的两个集合有不同的生命周期,第一个集合可以在第二个集合之前销毁(只是一个错位的大括号),然后当第二个集合试图访问时,它有悬空指针.你当然可以简单地小心你的变量,但保证两个独立的局部变量始终具有相同的生命周期,这很容易让人感到困惑.

如果同时创建同一类的两个集合元素,则可以保证它们同时构造和销毁.当然,该类应该是什么样子以及哪些代码应该去哪里的确切细节取决于问题的细节.但即使是使它们成为同一结构的唯一成员(和公共)的简单(虽然奇怪)比使用两个局部变量更好.

  • weak_ptr不会导致悬空指针.实际上,当其他人拥有您想要引用的对象时,它的存在恰恰是为了避免悬空指针. (4认同)