智能指针share_ptr
来源:互联网 发布:中国贸易顺差历年数据 编辑:程序博客网 时间:2024/04/30 00:27
智能指针的作用
C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。
shared_ptr的使用
shared_ptr多个指针指向相同的对象。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的,但是对象的读取需要加锁。
- 初始化。智能指针是个模板类,可以指定类型,传入指针通过构造函数初始化。也可以使用make_shared函数初始化。不能将指针直接赋值给一个智能指针,一个是类,一个是指针。例如std::shared_ptr<int> p4 = new int(1);的写法是错误的
- get函数获取原始指针
- 注意不要用一个原始指针初始化多个shared_ptr,否则会造成二次释放同一内存
- 注意避免循环引用,shared_ptr的一个最大的陷阱是循环引用,循环,循环引用会导致堆内存无法正确释放,导致内存泄漏。
- 案例:
#include <iostream>#include <memory>int main() { { int a = 10; std::shared_ptr<int> ptra = std::make_shared<int>(a); std::shared_ptr<int> ptra2(ptra); //拷贝 std::cout << ptra.use_count() << std::endl; int b = 20; int *pb = &a; //std::shared_ptr<int> ptrb = pb; //error std::shared_ptr<int> ptrb = std::make_shared<int>(b); ptra2 = ptrb; //赋值 pb = ptrb.get(); //获取原始指针(但一般不要使用,项目中很少会返回出原始指针) std::cout << ptra.use_count() << std::endl; std::cout << ptrb.use_count() << std::endl; }}
然后用make_share为prtb分配一段内存,把ptrb赋值给ptra2,这样ptra2便指向了ptrb,所以ptra的引用计数减1,ptrb的引用计数加1.
所以这里结果为1,2.
阅读全文
0 0
- 智能指针share_ptr
- 智能指针使用-share_ptr实例
- 智能指针使用-share_ptr实例
- boost::share_ptr智能指针使用示例
- boost::share_ptr智能指针使用示例
- boost::share_ptr智能指针使用示例
- boost::share_ptr智能指针使用示例
- 【C/C++】智能指针auto_ptr,share_ptr,unique_ptr
- 关于c++智能指针share_ptr的引用问题
- share_ptr智能指针模板类的简单实现(c++11)
- c++ boost 库中提供的share_ptr(智能指针)
- c++ boost 库中提供的share_ptr(智能指针)
- 智能指针share_ptr使用过程中需要注意的几点
- 模拟实现C++/boost库智能指针auto_ptr scoped_ptr和share_ptr
- share_ptr
- share_ptr
- Share_ptr
- 智能指针
- NUIST OJ 1364 [2017 江苏科技大学 程序设计竞赛]D.重复成绩统计(改编) 【STL-map】
- 依赖注入
- 陌陌基于Kubernetes和Docker容器管理平台的架构实践
- 适配器模式
- Servlet生命周期与工作原理
- 智能指针share_ptr
- Android下载json(包括服务器代码)
- 以后要学习的知识和计划
- Java通过API请求并处理DBLP数据
- 贪心笔记
- Centos7下Yum安装PHP5.5,5.6,7.0
- Storm Trident入门
- 接口测试用例设计
- JAVA中循环删除list中元素的方法总结