linux C++共享指针(std::shared_ptrstd::make_shared)共享对象,reset()重置共享指针,use_count()查看引用计数
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux C++共享指针(std::shared_ptrstd::make_shared)共享对象,reset()重置共享指针,use_count()查看引用计数相关的知识,希望对你有一定的参考价值。
文章目录
共享指针是一种智能指针,它提供了与 std::unique_ptr 相似的语法,但是它允许多个指针共享同一对象的所有权。
当不再需要该对象时,共享指针会自动计数,并在没有任何指针指向该对象时释放它。
示例
#include <memory>
#include <string>
#include <iostream>
int main()
// 创建一个指向字符串的 shared_ptr
std::shared_ptr<std::string> event = std::make_shared<std::string>("This is an event."); //This is an event.
std::cout << *event << std::endl;
// 查看共享对象引用计数
std::cout << "event.use_count() = " << event.use_count() << std::endl; //event.use_count() = 1
// 多个 shared_ptr 可以指向同一个对象
std::shared_ptr<std::string> event2 = event;
std::cout << *event2 << std::endl; //This is an event.
// 查看共享对象引用计数
std::cout << "event.use_count() = " << event.use_count() << std::endl; //event.use_count() = 2
std::cout << "event2.use_count() = " << event2.use_count() << std::endl; //event2.use_count() = 2
// 对象只有当所有 shared_ptr 对它的引用都断开后,才会被销毁
event.reset();
// 查看共享对象引用计数
std::cout << "event.use_count() = " << event.use_count() << std::endl; //event.use_count() = 0 //如果共享指针已被销毁,查看其引用计数,不会报错,值为0,有点奇怪(下同)
std::cout << "event2.use_count() = " << event2.use_count() << std::endl; //event2.use_count() = 1
event2.reset();
std::cout << "event.use_count() = " << event.use_count() << std::endl; //event.use_count() = 0
std::cout << "event2.use_count() = " << event2.use_count() << std::endl; //event2.use_count() = 0
return 0;
上面代码中,我们通过 std::make_shared<std::string>("This is an event.")
创建了一个指向字符串的 shared_ptr
。然后我们复制这个指针到了 event2,现在两个指针都指向了同一个字符串。当我们在最后调用 event.reset()
和 event2.reset()
时,因为两个指针都不再引用这个字符串,所以这个字符串就会被销毁。
如何确认引用计数为0后,被共享指针管理的共享对象是否已销毁?
可以在共享对象的析构函数中设置标识,然后在确定引用计数为0后,检查这个标识以确定共享对象是否已销毁。
#include <iostream>
#include <memory>
class A
public:
A()
std::cout << "A Constructed" << std::endl;
~A()
std::cout << "A Destructed" << std::endl;
;
int main()
std::shared_ptr<A> pA(new A);
std::cout << "A's Reference Count: " << pA.use_count() << std::endl;
std::shared_ptr<A> pB = pA;
std::cout << "A's Reference Count: " << pA.use_count() << std::endl;
std::cout << "B's Reference Count: " << pB.use_count() << std::endl;
pA.reset();
std::cout << "A's Reference Count: " << pA.use_count() << std::endl;
std::cout << "B's Reference Count: " << pB.use_count() << std::endl;
pB.reset();
std::cout << "A's Reference Count: " << pA.use_count() << std::endl;
std::cout << "B's Reference Count: " << pB.use_count() << std::endl;
return 0;
编译运行:
g++ test.cpp && ./a.out
结果:
以上是关于linux C++共享指针(std::shared_ptrstd::make_shared)共享对象,reset()重置共享指针,use_count()查看引用计数的主要内容,如果未能解决你的问题,请参考以下文章