C++11 std::shared_ptr总结与使用
发布日期:2021-09-11 05:53:09 浏览次数:9 分类:技术文章

本文共 2183 字,大约阅读时间需要 7 分钟。

最近看代码,智能指针用的比较多,自己平时用的少,周末自己总结总结。方便后续使用。

std::shared_ptr大概总结有以下几点:

(1) 智能指针主要的用途就是方便资源的管理,自动释放没有指针引用的资源

(2) 使用引用计数来标识是否有多余指针指向该资源。(注意,shart_ptr本身指针会占1个引用)

(3) 在赋值操作中, 原来资源的引用计数会减一,新指向的资源引用计数会加一。

     std::shared_ptr<Test> p1(new Test);

     std::shared_ptr<Test> p2(new Test);

     p1 = p2;

(4) 引用计数加一/减一操作是原子性的,所以线程安全的。

(5) make_shared要优于使用new,make_shared可以一次将需要内存分配好

std::shared_ptr
p = std::make_shared
(); std::shared_ptr
p(new Test);

(6) std::shared_ptr的大小是原始指针的两倍,因为它的内部有一个原始指针指向资源,同时有个指针指向引用计数。

(7) 引用计数是分配在动态分配的,std::shared_ptr支持拷贝,新的指针获可以获取前引用计数个数。

 

下面是一段示例代码,注释详细:

1 include 
2 #include
3 #include
4 #include
5 #include
6 7 struct Test 8 { 9 Test() { std::cout << " Test::Test()\n"; }10 ~Test() { std::cout << " Test::~Test()\n"; }11 };12 13 //线程函数14 void thr(std::shared_ptr
p)15 {16 //线程暂停1s17 std::this_thread::sleep_for(std::chrono::seconds(1));18 19 //赋值操作, shared_ptr引用计数use_cont加1(c++11中是原子操作)20 std::shared_ptr
lp = p;21 { 22 //static变量(单例模式),多线程同步用23 static std::mutex io_mutex;24 25 //std::lock_guard加锁26 std::lock_guard
lk(io_mutex);27 std::cout << "local pointer in a thread:\n"28 << " lp.get() = " << lp.get()29 << ", lp.use_count() = " << lp.use_count() << '\n';30 } 31 }32 33 int main()34 {35 //使用make_shared一次分配好需要内存36 std::shared_ptr
p = std::make_shared
();37 //std::shared_ptr
p(new Test);38 39 std::cout << "Created a shared Test\n"40 << " p.get() = " << p.get()41 << ", p.use_count() = " << p.use_count() << '\n';42 43 //创建三个线程,t1,t2,t344 //形参作为拷贝, 引用计数也会加145 std::thread t1(thr, p), t2(thr, p), t3(thr, p);46 std::cout << "Shared ownership between 3 threads and released\n"47 << "ownership from main:\n"48 << " p.get() = " << p.get()49 << ", p.use_count() = " << p.use_count() << '\n';50 //等待结束51 t1.join(); t2.join(); t3.join();52 std::cout << "All threads completed, the last one deleted\n";53 54 return 0;55 }

编译执行:

 

参考:

http://www.cnblogs.com/xudong-bupt/p/6736783.html

https://blog.csdn.net/coolmeme/article/details/43195587

http://www.cnblogs.com/lanxuezaipiao/p/4132096.html

转载地址:https://blog.csdn.net/weixin_34406061/article/details/86085281 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:大学总结(三)即大二结束
下一篇:法线贴图是用来解决低模的细节表现问题

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月31日 20时28分07秒