动态内存管理: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++——智能指针的更多相关文章

  1. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  2. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  3. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  4. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  5. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  6. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

  7. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  8. C++ 引用计数技术及智能指针的简单实现

    一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...

  9. C++11智能指针读书笔记;

    智能指针是一个类对象,而非一个指针对象. 原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 它的一种通用实现 ...

  10. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

随机推荐

  1. 20150721—HTML的定位 JS (转)

    本文转载于:http://blog.csdn.net/xuantian868/article/details/3116442   HTML:scrollLeft,scrollWidth,clientW ...

  2. 二分查找法:x 的平方根

    实现 int sqrt(int x) 函数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. public int mySqrt(int x) { long left=0; long r ...

  3. Linux(Ubuntu)常用命令(四)

    权限修改: 先知: u user 表示该文件的所有者 g group 表示与该文件的所有者属于同一组( group )者,即用户组 o other 表示其他以外的人 a all 表示这三者皆是 r r ...

  4. 搭建邮件服务器 使用Postfix与Dovecot

    首先需要从yum中下载安装三个服务:bind-chroot    postfix     dovecot 配置文件依次: /etc/named.conf 下载安装完后要开启的服务:named     ...

  5. pyppeteer模块的基本使用

    pyppeteer模块的基本使用 引言 Selenium 在被使用的时候有个麻烦事,就是环境的相关配置,得安装好相关浏览器,比如 Chrome.Firefox 等等,然后还要到官方网站去下载对应的驱动 ...

  6. XMLSpy 生成xml模板(转)

    公司中的生成ci需要和xsd中的sequence一致, 由于xsd的过于庞大,且有继承关系, 所以人工比较是不可能的. 现用xmlspy来生成. 1, 在xmlspy中打开xsd 2, 将choice ...

  7. redis 入门之有序集合

    zadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中.如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 ...

  8. java虚拟机规范(se8)——class文件格式(五)

    4.7.1 定义和命名新属性 允许编译器定义和发布的class文件在class文件结构体.field_info结构体.method_info结构体和Code结构体中的attributes表中包含新的属 ...

  9. 关于清除浮动的n中方式

    我们在对页面进行布局的时候经常会用到浮动布局,浮动布局能够很好的实现我们想要的布局效果,同时兼容方面也是很好的,但是当我们在用左右浮动进行页面布局的时候,由于元素浮动脱了了文档流导致浮动元素的父级高度 ...

  10. CentOS使用手册(二)

    前言: 本篇目录: 1.Linux软件安装调试 2.Linux内存.CPU.进程.端口.硬盘管理 3.Linux systemctl管理服务.防火墙firewalld以及SELinux配置 Linux ...