我有以下Container
类
template <typename T>
class Container
{
private:
std::vector<std::shared_ptr<T>> items_;
public:
void addItem(std::shared_ptr<T> item)
{
std::cout << "useCount addItem pre: " << item.use_count() << std::endl;
items_.push_back(std::move(item));
std::cout << "useCount addItem post: " << item.use_count() << std::endl;
}
};
我这样称呼它
int main(int argc, char** argv) {
std::unique_ptr<Container<std::string>> container = std::make_unique<Container<std::string>>();
std::shared_ptr<std::string> s = std::make_shared<std::string>("hello");
std::cout << "useCount main pre: " << s.use_count() << std::endl;
container->addItem(s);
std::cout << "useCount main post: " << s.use_count() << std::endl;
return 0;
}
这是我得到的输出
useCount main pre: 1
useCount addItem pre: 2
useCount addItem post: 0
useCount main post: 2
逐行...
有道理,s
定义后只有一个参考
具有意义,s
被复制到item
中,因此其引用计数增加1
我已授予items_
的item
所有权,因此,由于addItem
放弃了所有权并将其转让给items_
,因此引用计数不应更改。我希望引用计数为2,一次来自main
,一次来自items_
。而是为0。
只要一个参考来自main
,一个参考就来自items_
,就可以理解。
感谢您的澄清!
std::move
将项目从该变量移到另一个变量。正如一位作者所说,它是“ has explicit license to pillage [the variable]”。对于most std objects,会将原始对象置于未指定状态。但是,它显示为std:shared_ptr
is an exception,因为它使对象处于空白状态。
从共享指针移出后,它应该为空。空的共享指针的使用计数为0。