我有一个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
答案 0 :(得分:3)
我不相信以上说法是正确的?
根据您的需求规范,这是正确的。
尤其是以下声明:
output_vec.push_back( *iter );
具有以下效果:
*iter
返回对智能指针的引用,即std::shared_ptr<Foo>&
。output_vec.push_back
将创建一个新智能指针,并调用 copy-constructor 。std::shared_ptr
的副本构造函数:
构造一个shared_ptr,它共享由r管理的对象的所有权。
因此将增加共享对象的引用计数器。
仅出于完整性考虑,我会添加一些个人建议。
1) For-each 循环可以用更好的方式表示:
for (const auto& ptr : main_vec) {
if (ptr->bar()) output_vec(ptr);
}
2)特别是,此for-each可以与copy_if
进行合成。
答案 1 :(得分:2)
我猜测这将复制shared_ptr
正确。
但不增加原始文件的ref_count
否,复制构造函数确实会增加引用计数。这就是共享指针被设计为可复制的方式。
我不确信上面的说法是正确的吗?
那我就说服您:是正确的。