C++——智能指针
动态内存管理:new-delete——很难正确释放内存——智能指针
使用场景:
1.程序不知道自己要使用多少对象
2.程序不知道自己所需对象的准确类型
3.程序需要在多个对象之间共享数据
4.坚持只使用智能指针,可以避免指针的内存管理可能带来的问题:
- 忘记delete内存——内存泄漏
- 使用已经释放掉的空间
- 同一块内存释放两次
- 查找指向相同内存的指针非常困难
void f()
{
shared_ptr<int> sp(new int());
//之后的代码出现异常,在f中没有被捕获
}//函数结束时,shared_ptr会自动释放内存 void f()
{
int *ip=new int();
//之后的代码出现异常,在f中没有被捕获
delete ip;
}//如果在new和delete之间发生异常,且没有捕获,内存就永远不会被释放了
5.不要混合使用普通指针和智能指针
void process(shared_ptr<int> ptr)//函数被调用时,创建ptr并初始化;值传递,有一次拷贝
{
//
}//ptr离开作用域,被销毁 shared_ptr<int> p(new int());//引用计数1
process(p);//拷贝p会增加引用计数;在process中引用计数为2
int i=*p;//正确,引用计数为1 int *x(new int());//X是普通指针,不是智能指针
precess(x);//错误
process(shared_ptr<int>(x));//合法,但是内存会因为退出函数时,被释放而释放
int j=*x;//错误,x已经被释放
类别
1.shared-ptr:多指针指向同一对象
make_share<T> ( )
2.unique-ptr:独占对象

shared_ptr重要知识点
1.shared_ptr必须显示直接初始化
shared_ptr<double> p1;
shared_ptr<int> p1=new int();//错误,尝试用int*隐式初始化
shared_ptr<int> p2(new int());//正确,直接初始化 shared_ptr<int> clone(int P){
//return new int(P);//错误
return shared_ptr<int>(new int(p));//正确,显示绑定
}
2.不要用get初始化另一个智能指针或赋值
get:向不能使用智能指针的代码传递内置指针。智能在确认代码不会被delete情况下才能使用
shared_ptr<int> p(new int());
int *q=p.get();
{
shared_ptr<int> (q);
}//q被销毁,指向的内存被释放
int foo =*p;//未定义,p指向的内存已经被释放
3.不使用相同的内置指针初始化或reset多个智能指针
4.不delete掉 get()返回的指针。记住原智能指针销毁后,get()的指针就无效了
5.如果使用智能指针管理的资源不是new分配的内存,记得传递给他一个删除器。//?
unique_ptr<objT,delT> p(new objT,fcn);
unique_ptr重要知识点
1.不能拷贝或赋值它本身,但可以release或reset它指向的内容
unique_ptr<string> p1(new string("word"));
unique_ptr<string> p2(p1);//错误
unique_ptr<string> p3;
p3=p2;//错误
unique_ptr<string> p2(p1.release());//p2被初始化为p1原来保存的指针,p1置空
unique_ptr<string> p3(new string("text"));
p2.reset(p3.release());//释放了p2的“word”内存, p3的所有权转给了p2 ,p3置空
p2.release();//错误,p2不会释放内存, 且丢失了指针
auto p=p2.release();//正确,但记得delete(p)
weak_ptr
1.w=p;不会改变p的引用计数,当最后一个p的对象被释放,w被释放
C++——智能指针的更多相关文章
- enote笔记法使用范例(2)——指针(1)智能指针
要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- C++智能指针
引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...
- EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针
一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...
- 智能指针shared_ptr的用法
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...
- 智能指针unique_ptr的用法
unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- C++ 引用计数技术及智能指针的简单实现
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...
- C++11智能指针读书笔记;
智能指针是一个类对象,而非一个指针对象. 原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 它的一种通用实现 ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
随机推荐
- MVC路由解析---IgnoreRoute
MVC路由解析---IgnoreRoute 文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Are ...
- 洛谷 P1119 灾后重建——dijstra
先上一波题目 https://www.luogu.org/problem/P1119 这道题我们可以将询问按时间排序 然后随着询问将相应已经重建成功的点进行操作 每次更新一个点就以他为起点跑一遍dij ...
- centos 7.2 离线安装 gcc
1.查看有没有挂载 centos 7.2 的镜像源文件 2.如果没有就通过服务端挂载 如果不知怎么挂载,就解压CentOS-7-x86_64-DVD-1511.iso 镜像文件,在Packages找到 ...
- BZOJ 4765(分块+树状数组)
题面 传送门 "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能计算数列区间和,而普通计算姬能计算树中子树和.更 ...
- luoguP1079 Vigenère 密码 题解(NOIP2012)
P1079 Vigenère 密码 题目 #include<iostream> #include<cstdlib> #include<cstdio> #includ ...
- 基于虚拟用户登录的ftp服务配置
文章结构: 一.使用逻辑卷配置ftp数据存放目录 二.安装和配置vsftpd服务 三.使用不通权限的用户访问ftp服务器 系统环 ...
- linuxprobe培训第3节课笔记2019年7月7日
linux常用命令: echo:在终端输出字符串或变量提取后的值 date:显示及设置系统的时间或日期 reboot:重启 poweroff:关机 wget:下载 ps:查看系统中的进程状态(常用参数 ...
- Sass-属性嵌套
Sass 中还提供属性嵌套,CSS 有一些属性前缀相同,只是后缀不一样,比如:border-top/border-right,与这个类似的还有 margin.padding.font 等属性.假设你的 ...
- Java集合类框架的最佳实践有哪些
根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList. 有些集合类允许指定初始容量.因此,如果我们能估计出存 ...
- .net 开源项目地址
https://github.com/dotnet/corefx 这个是.net core的 开源项目地址 https://github.com/aspnet 这个下面是asp.net core 框架 ...