12.动态内存和智能指针、 直接管理内存、shared_ptr和new结合使用
12.动态内存和智能指针
1.智能指针分为两种shared_ptr和unique_ptr,后者独占所指向的对象。智能指针也是模板,使用时要用尖括号指明指向的类型。类似emplace成员,make_shared用其参数来构造给定类型的对象。(make_shared创建一个对象并将之初始化,返回一个指向该类型的指针。
2.每个智能指针都有一个关联的计数器,称为引用计数,用来记录有多少个shared_ptr指向相同得对象3.p.use_count(),当计数值为零时,其析构函数将自动释放对象和相关联的内存。为减少资源浪费,要记得删除那些不需要的share_ptr.
4.使用动态内存的一个常见原因是允许多个对象共享相同的状态。为了实现我们所希望的数据共享,我们为每个类的对象设置一个shared_ptr来管理类。
12.1.2 直接管理内存
1.因为在自由空间分配的内存是无名的,因此new 无法为其分配的对象命名,而是返回一个指向该对象的指针,若是不用delete(调用析构函数) 来操作该指针,新分配的这块内存将始终存在(即使改变指针的指向或指针失效),这就是内存泄漏问题,还有一个空悬指针问题就是在释放该内存后,未能将所有原指向该内存的所有指针置为空,而使某些指针仍指向原来那块内存。(free不调用析构函数)
2.我们可以使用直接初始化的方式来初始化一个动态分配的对象
如:int* p = new int(3);,
int *p(new int(42));
3.此外,还有默认初始化和值初始化,默认初始化的内存对象值是未定义的,而值初始化的内存对象的值是良好定义的。建议对动态分配的内存进行初始化。
int *pi = new int; //默认初始化,值未定义
int *pi2 = new int(); //值初始化,值是良好定义的,为0
4.我们也可以使用auto来从初始化器的值推断出我们想要分配的对象的类型int *p = new auto (3),但初始化器若是一个初始值列表时,则不能用auto来推断(因为auto推断不出来,不知道是vector还是其他的什么)
5.用new动态分配const对象是合法的:const int *pci = new const int(1024),但必须对该内存执行初始化。
6.delete p可以销毁给定指针所指向的对象,释放该对象的内存,但是delete只能对指向动态分配的内存的指针或空指针操作,否则行为未定义,另外,不能多次delete指向同一块内存的指针。
7.指向new分配的内存的指针是内置指针(普通指针),指向make_shared分配的内存的指针是智能指针。智能指针用make_shared或new的返回值来初始化。建议使用智能指针,从而避免内存泄漏和空悬指针等问题。
12.1.3 shared_ptr和new结合使用
1.不存在从普通指针到智能指针的相互转化的构造函数
2.shared_ptr<T>p(q),若q为内置指针,则应该只有两种选择new T ()或shared_ptr<T>(p);第一种是直接初始化,第二种是显示转化。
3.智能指针的初始化:shared_ptr<int> p1(new int(1024);
Shared_ptr<int> p2(make_shared<int> (2014);
Shared_ptr<int>p3 = make_shared<int> (1024);
推荐使用make_shared
4.p.reset()函数,作用是使p和参数的指向相同,会影响引用计数,所以当参数列表为空时,p = nullptr,p原来所指对象会因引用计数为0而被释放,参数列表为内置指针和智能指针时,其作用可想而知。
5.int *x(new int(1024));是危险的,因为x是一个普通指针,而不是一个智能指针。
6.当将一个shared_ptr绑定到一个普通指针时,我们就将内存的管理责任交给了这个shared_ptr。之后,我们就不应该再使用内置指针来访问那块内存了。
7.p.get()函数,返回一个和p指向相同的内置指针,同样影响引用计数,
8.判断一个shared_ptr指针是否是指向该对象的唯一指针,可以用p.unique(),但是用p.use_count() == 1没那么好。
const char *s1 = "hello world";s1是常量指针
12.动态内存和智能指针、 直接管理内存、shared_ptr和new结合使用的更多相关文章
- 【C++】动态内存与智能指针
C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...
- C++相关:动态内存和智能指针
前言 在C++中,动态内存的管理是通过运算符new和delete来完成的.但使用动态内存很容易出现问题,因为确保在正确的时间释放内存是及其困难的.有时候我们会忘记内存的的释放,这种情况下就会产生内存泄 ...
- 【足迹C++primer】39、动态内存与智能指针(3)
动态内存与智能指针(3) /** * 功能:动态内存与智能指针 * 时间:2014年7月8日15:33:58 * 作者:cutter_point */ #include<iostream> ...
- c++学习笔记—动态内存与智能指针浅析
我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象.类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁. 栈内存用来保存定义在函数内部的非stat ...
- c++智能指针(unique_ptr 、shared_ptr、weak_ptr、auto_ptr)
一.前序 什么是智能指针? ——是一个类,用来存储指针(指向动态分配对象也就是堆中对象的的指针). c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写 ...
- c++智能指针的使用,shared_ptr,unique_ptr,weak_ptr
c++智能指针的使用 官方参考 普通指针的烦恼:内存泄漏,多次释放,提前释放 智能指针 负责自动释放所指向的对象. 三种智能指针 shared_ptr,unique_ptr,weak_ptr: 将sh ...
- boost的线程池和内存池 智能指针
内存池为boost自带的 #include <boost/pool/pool.hpp> 或者另外一个开源的库: nedmalloc 一个高效率的库 线程池需要下载另外一个开源库 http: ...
- C++11智能指针(unique_ptr、shared_ptr、weak_ptr)(转)
原文地址:https://blog.csdn.net/king_way/article/details/95536938
- Qt 智能指针学习(7种指针)
Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...
随机推荐
- Thymeleaf的基本用法
俗话说,不会前端的后端工程师不是一个合格的程序员.因为在项目中经常要和前端工程师打交道,并且偶尔也会涉及前端的简单开发,因此在闲暇之余学习了一点前端的知识,今天首先总结归纳一下 Thymeleaf 模 ...
- c语言中 char* 和 unsigned char* 的区别浅析(转)
原文:https://blog.csdn.net/guotianqing/article/details/77341657 背景最近在项目中遇到了一个编译警告,是因为定义的变量为char[],而在使用 ...
- nat123+nginx实现外网访问本机IIS发布的系统
故事开端(前因) 嗯,内网其实是校园网络,服务器呢,不是阿里云.腾讯云之类的云服务器,而是自己正在码字的笔记本电脑:有公网IP吗?没有!校园IP分配的IP固定不?不固定,动态分配的,额~~~. 我想想 ...
- xlrd模块-读取Execl表格
#xlrd模块 读取execl表格 import xlrd Execl = xlrd.open_workbook(r'Z:\Python学习\python26期视频\day76(allure参数.读e ...
- java - CAS及CAS底层原理
CAS是什么? CAS的全称为Compare-And-Swap它是一条CPU并发原语,也就是在CPU硬件层面上来说比较并且判断是否设置新值这段操作是原子性的,不会被其他线程所打断.在JAVA并发包ja ...
- Laravel中使用QRcode自制二维码
一.配置 1.在项目根目录输入命令 composer require simplesoftwareio/simple-qrcode 1.3.* 2.在config/app.php 的 provider ...
- MDK Debug (printf) Viewer打印数据
1.Target Options -> Debug -> Settings(JLink) -> Debug里ort选择SW模式 2.在Target Options -> Deb ...
- vjudge I - Vladik and fractions 一道小学生的提。
原题链接:https://vjudge.net/contest/331993#problem/I Vladik and Chloe decided to determine who of them i ...
- 《深入理解java虚拟机》读书笔记七——第八章
第八章 虚拟机字节码执行引擎 1.运行时栈帧结构 概述: 栈帧是用于支持虚拟机进行方法调用的和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素,栈帧存储了方法的局部变量,操作数栈,动态连 ...
- C#之Quartz任务调度的使用(2.2.3.400)
这里使用的Quartz版本号为2.2.3.400,.net 框架为4.0. 目的实现一个小案例,每隔一秒钟打印一条记录.后面会附上源码,以供参考. 建立一个 控制台程序. 代码: class Pro ...