Loading... C++中的智能指针是一种对象,它可以像常规指针一样存储对象的地址,但它有一个额外的特性:当没有任何东西引用该地址时,智能指针会自动删除该对象。这种特性可以帮助我们避免内存泄漏。在C++11及以后版本中,有几种类型的智能指针:unique_ptr、shared_ptr和weak_ptr。本文将重点介绍shared_ptr。![](https://www.8kiz.cn/usr/uploads/2023/10/3994529829.png) 首先来看看如何创建一个shared_ptr。我们可以使用std::make_shared函数来创建一个新的shared_ptr: ```cpp std::shared_ptr<int> p1 = std::make_shared<int>(42); ``` 在这个例子中, 我们创建了一个新的int类型值为42,并且将其封装在了p1这个共享型智能指针里。 如果你已经有了一个原始(raw) 指针,并且想要把它转换为 shared pointer, 你应该使用 std::share 函数: ```cpp int* raw = new int(42); std::shared_ptr<int> p2(raw); ``` 但是要注意,在转换原始(raw) 指向后,请确保没有其他 shared pointer 或者 raw pointer 仍然引用到同样内存区域。 接下来让我们看一下如何访问 shared pointer 所管理资源: ```cpp std::cout << *p1 << std::endl; // 输出: 42 ``` 就像普通指针一样,我们可以使用解引用运算符(*)来访问 shared pointer 所指向的对象。 shared_ptr 的一个重要特性是引用计数。每当一个新的 shared_ptr 指向同一对象,引用计数就会增加。当一个 shared_ptr 被销毁或者不再指向该对象时,引用计数就会减少。当没有任何东西再指向该对象时(即:引用计数为0),那么这个对象就会被自动删除。 ```cpp { std::shared_ptr<int> p3 = p1; // 引用计数增加 std::cout << p1.use_count() << std::endl; // 输出: 2 } // 当p3离开其作用域后, 引起其被销毁, 引起p1的use_count减少 std::cout << p1.use_count() << std::endl; // 输出: 1 ``` 在这个例子中, 我们创建了另外一个共享型智能指针p3,并且让它和p1都同时管理同样的资源。因此在创建了p3后,我们可以看到use_count变成了2. 当离开作为域后,p3被销毁,并且导致use_count变回到了原来值。 最后要注意,在使用shared pointer时有两点需要注意: - 不要让两个独立创建的 shared pointer 管理同一资源。 - 不要使用 delete 删除 shared pointer 管理的资源。 以上就是关于C++中shared_ptr的基本使用教程。希望这篇文章能帮助你理解和使用shared_ptr,从而更好地管理内存资源。 #### [云服务器推荐](https://www.tsyvps.com/) #### [蓝易云](https://www.tsyvps.com/)国内/海外高防云服务器推荐 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.tsyvps.com" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://www.8kiz.cn/img/6.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">蓝易云-五网CN2服务器【点我购买】</p> <div class="inster-summary text-muted"> <span style='color: red;'>蓝易云采用KVM高性能架构,稳定可靠,安全无忧!<br>蓝易云服务器真实CN2回国线路,不伪造,只做高质量海外服务器。</span> </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> --- **<span style='color:#000000'>海外免备案云服务器链接:[www.tsyvps.com](https://www.tsyvps.com)</span>** **<span style='color:#DC143C'>蓝易云香港五网CN2 GIA/GT精品网络服务器。拒绝绕路,拒绝不稳定。</span>** --- #### **百度搜索:[蓝易云](https://www.baidu.com/s?ie=UTF-8&wd=%E8%93%9D%E6%98%93%E4%BA%91)**![](https://www.8kiz.cn/usr/uploads/2023/10/1859178635.png) 最后修改:2023 年 10 月 17 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏