智能指针的临时性是否具有引用计数,或者如果有,它是否包含其引用计数?

Does the temporary of a smart pointer have a reference count, or if so, does it insrement its reference count?

提问人:Chase Liu 提问时间:8/2/2023 更新时间:8/2/2023 访问量:53

问:

我在阅读“C++ 入门 5th”的“第 12.1 节”时有一个问题。可以描述如下:

auto p = std::shared_ptr<int>(new int(42));
std::cout << p.use_count() << std::endl;

输出将为“1”,这意味着只有一个引用对象。但是,当用作赋值的右操作数时,与 a 关联的“计数器”将递增(第 452 页,C++ 入门第 5 行第 4 行)。因此,如果 temporary 有一个计数器,则在用作赋值的右操作数后,它会将其计数器递增为 2。我不知道智能指针实现的细节,智能指针的临时性有参考计数吗?如果是这样,它是否包含其参考计数?shared_ptrshared_ptrstd::shared_ptr<int>(new int(42))

C++ 临时智能指针

评论

4赞 Alan Birtles 8/2/2023
临时对象是与任何其他对象一样的对象,其行为与您创建然后销毁非临时对象的行为完全相同
4赞 Ted Lyngmo 8/2/2023
但是,您的示例中没有临时。这和做是一样的std::shared_ptr<int> p(new int(42));
5赞 Quimby 8/2/2023
代码中没有赋值,仍调用构造函数,而不是赋值运算符。Object x = 5;
2赞 463035818_is_not_an_ai 8/2/2023
即使有临时的,即使它是赋值,临时的也会在表达式的末尾被销毁。在下一行中,use_count只能是 1,因为只有 1 个智能指针
1赞 463035818_is_not_an_ai 8/2/2023
你为什么担心?性能?您是否害怕意外编写代码,导致智能指针的引用计数损坏?

答:

3赞 pptaszni 8/2/2023 #1

是的,临时具有引用计数。但是,在您的示例中没有临时的,此行仅调用构造函数。如果要观察通过创建临时副本来增加和减少引用计数,可以执行以下操作:shared_ptrauto p = std::shared_ptr<int>(new int(42));

std::shared_ptr<int> p1{new int(1)};
std::cout << p1.use_count() << std::endl;  // prints 1
std::cout << std::shared_ptr<int>(p1).use_count() << std::endl;  // prints 2, because you made a temporary copy of your original ptr
std::cout << p1.use_count() << std::endl;  // prints 1 again, temporary was destroyed