【发布时间】:2020-05-11 03:29:39
【问题描述】:
我有以下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我已将
item的所有权授予items_,因此引用计数不应更改,因为addItem已放弃所有权并将其转移给items_。我希望引用计数为 2,一次来自main,一次来自items_。相反,它是 0。只要一个引用来自
main并且一个引用来自items_就有意义。
感谢您的澄清!
【问题讨论】:
-
在#3 中,您正在查看一个已被移出的变量。
item持有一个空指针。 -
@IgorTandetnik 它不为空。它是空的。保存 null 的非空共享指针和不保存任何内容的空共享指针之间存在(非常细微的)区别。
标签: c++ c++11 shared-ptr smart-pointers