了解在传递给函数时shared_ptr参考计数增加的原因

问题描述 投票:3回答:2

我有以下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

逐行...

  1. 有道理,s定义后只有一个参考

  2. 具有意义,s被复制到item中,因此其引用计数增加1

  3. 我已授予items_item所有权,因此,由于addItem放弃了所有权并将其转让给items_,因此引用计数不应更改。我希望引用计数为2,一次来自main,一次来自items_。而是为0。

  4. 只要一个参考来自main,一个参考就来自items_,就可以理解。

感谢您的澄清!

c++ c++11 shared-ptr smart-pointers
2个回答
2
投票

std::move将项目从该变量移到另一个变量。正如一位作者所说,它是“ has explicit license to pillage [the variable]”。对于most std objects,会将原始对象置于未指定状态。但是,它显示为std:shared_ptr is an exception,因为它使对象处于空白状态。


3
投票

从共享指针移出后,它应该为空。空的共享指针的使用计数为0。

© www.soinside.com 2019 - 2024. All rights reserved.