关于 c :将现有的 shared_ptr 附加到 shared_ptr 的向量中

Appending an existing shared_ptr to a vector of shared_ptr

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

1
2
3
4
5
6
7
8
9
10
11
12
...
//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 not convinced the above is correct??

根据你的需求规范,没错。

如果您想了解更多...

特别是声明:

1
output_vec.push_back( *iter );

有以下效果:

  • *iter 返回对智能指针的引用,即 std::shared_ptr<Foo>&
  • output_vec.push_back 将创建一个新的智能指针,调用复制构造函数。
  • std::shared_ptr 的复制构造函数:

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

所以对共享对象的引用计数器会增加。

补充笔记...

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

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

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

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

合成


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?

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