将现有的 shared_ptr 附加到 shared_ptr 的矢量

Appending an existing shared_ptr to a vector of shared_ptr

我有一个 shared_ptr 的现有向量。我想搜索该向量,如果满足条件,则将相应的 shared_ptr 复制到新向量。

...
//vector< shared_ptr<Foo> > main_vec; // which already has some data
vector< shared_ptr<Foo> > output_vec{};

for ( auto iter = main_vec.begin() ; iter != main_vec.end() ; ++iter )
{
  if ( (*iter)->bar() == true )
    output_vec.push_back( *iter );
}

return output_vec;
...

我不相信以上是正确的??我猜这会复制 shared_ptr 但不会增加原件的 ref_count,还是我想多了?我对智能指针还很陌生。

TIA

I am guessing that this will copy the shared_ptr

正确。

but not increase the ref_count of the original

不,复制构造函数确实增加了引用计数。这就是共享指针被设计成可复制的方式。

I am not convinced the above is correct?

那么让我说服你:这是正确的。

I am not convinced the above is correct??

根据您的需求说明,正确。


如果你想了解更多...

特别声明:

output_vec.push_back( *iter );

具有以下效果:

  • *iter returns 对智能指针的引用,即 std::shared_ptr<Foo>&.
  • output_vec.push_back 将创建一个 new 智能指针,调用 copy-constructor.
  • std::shared_ptr的拷贝构造函数:

    Constructs a shared_ptr which shares ownership of the object managed by r.

因此共享对象的引用计数器将增加。

补充说明...

为了完整起见,我会添加一些个人建议。

1) For-each循环可以用更好的方式表达:

for (const auto& ptr : main_vec) {
  if (ptr->bar()) output_vec(ptr);
}

2) 特别是,这个 for-each 可以用 copy_if.

合成