C++动态分配new(C++ primer,P320)
主要包含一下几部分内容
后续可能会再补充
- new分配内存块的来源
- new时初始化
- new失败时
- new运算符、函数、替换函数
- 定位new运算符
- 定位new的重载
new分配内存块的来源
C++ primer plus书中P321页说,new负责在堆(heap)中找到一个足以能够满足要求的内存块。
但更多的文章都说new从自由存储区(free store)上为对象动态分配内存空间;
找到一个相对权威的博文吧,上面仔细介绍了一下:
自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。
那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。
至于operator new的具体实现细节,还没来得及去看,等后续了解之后补上。
c++new自由存储区
new初始化
两种初始化方法,()和{ },建议用{ }
//*npa,*npb值为6
int *npa = new int (6);
int *npb = new int {6};
//指向数组就只有下面一种初始化方法
int *nparr = new int[4] {1, 2, 3, 4};
new失败时
会引发std::bad_alloc异常,具体内容还没复习到,后续补充。
new运算符、函数、替换函数
new,delete(包括new[],delete[])都是调用函数:
void * operator new (std::size_t);
void * operator new[] (std::size_t);void * operator delete (void *);
void * operator delete[] (void *);
而且这些函数是可替换的,可以定义自己的new函数替换上述函数。(书上原话,注意是可替换的,看文章说new/delete也可以被重载)
定位new函数
需要包含 #include < new > 头文件!
定位new是可重载的!!
注意这个new函数工作原理是返回传递给它的地址,并将其强制转换成为(void *)型指针。它没有向堆/静态存储区域申请空间,也无需delete;
用法:
#include <new>
char buffer[20];
...//原本的new//实际是调用下面这个函数//new(sizeof(double) * 3);
double *p = new double[3];
...//*pa指向的是buffer//实际是调用下面这个函数//new(sizeof(double) * 4, buffer);
double *pa = new (buffer) double[4];//*pb指向的是(buffer + 2 * sizeof(double))
double *pb = new (buffer + 2 * sizeof(double)) double[4];
C++动态分配new(C++ primer,P320)相关推荐
- C++ Primer 第三版 读书笔记
1.如果一个变量是在全局定义的,系统会保证给它提供初始化值0.如果变量是局部定义的,或是通过new表达式动态分配的,则系统不会向它提供初始值0 2.一般定义指针最好写成:" string * ...
- 《C Primer Plus》读书笔记——存储类、链接和内存管理
背景 距离上次写读书笔记的日子已有半个月了.这段时间一直在做摄像头直立平衡车,也把<C Primer Plus>的中级部分扫了一遍.现在做赛道算法识别遇到瓶颈了,就想把读书笔记补回来.原计 ...
- c++ primer 5th第13章拷贝控制知识点和自编习题答案
首先,先给大家提个醒.在网上的随书源代码里关于hasptr类的类指针版本编写的移动构造函数.移动赋值运算符.和析构函数部分是有错误的.大家可以把hasptr累指针版本(里面带移动构造函数和移动赋值运算 ...
- Primer c++ 第5版pdf
下载地址:网盘下载 内容简介 · · · · · · 这本久负盛名的 C++经典教程,时隔八年之久,终迎来史无前例的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的--C++ 大师 Stanle ...
- C++11 Primer Plus(三)之名称空间与类
自己写的C++11 Primer Plus 学习笔记,如有雷同不胜荣幸,如有错误敬请指正 1. 内存模型与名称空间 1. 单独编译(程序划分) 友好的程序代码结构: 头文件:包含结构声明和使用这些结构 ...
- C++ Primer Plus课后编程练习第6章参考代码
(C++ Primer Plus课后编程练习第6章参考代码) 声明: 作者入门小白,将学习过程中的代码做一些分享,仅供大家参考,欢迎大家交流指正.全部编译运行过,水平有限,不喜勿喷. 环境: Wind ...
- C++Primer笔记——拷贝控制
CHAPTER13-拷贝控制(C++ Primer笔记) 13.1 拷贝.赋值与销毁 13.1.1 拷贝构造函数 13.1.2 拷贝赋值运算符 13.1.3 析构函数 13.1.4 三/五法则 13. ...
- C++ Primer读书摘要(一)
C++ Primer 第一章 快速入门 1.1 编写简单的C++程序 任何一个都要包含一个main函数,因为这个函数是系统执行入口c++也一样,函数格式是 int main(); 和别的主要函数不同C ...
- C++ primer(第五版)简单读书笔记
目录 第一章 开始 第二章 变量和基本类型 第三章 字符串.向量和数组 第四章 表达式 第五章 语句 第六章 函数 第七章 类 第八章 IO库 第九章 顺序容器 第十章 泛型算法 第十一章 关联容器 ...
最新文章
- R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战
- 如何把主机系统上传到服务器,主机系统上传到服务器
- Java程序员进阶的 3 个层次,你处于哪个?
- HugeGraph图数据库获Apache TinkerPop官方认证
- 帝国CMS7.0 7.2 7.5微信登录插件 UTF-8版本
- 汇编在嵌入式编程中的作用_如何在嵌入式Power BI报表中以编程方式传递凭据
- 6.6 BERT家族02——sentence-BERT、BioBERT
- LVS-DR工作原理图文详解(转载)
- c php乱码,Cknife的PHP功能部分修正,解决SHELL无法回显以及中文乱码
- 第二章 原理图绘制与检查
- 怎样将计算机和电视机连接网络连接,电脑怎么连接电视 电脑和电视连接方法图文教程...
- 通过多视图信息瓶颈学习鲁棒表征
- 骨传导耳机是利用什么原理听歌?什么骨传导耳机好用
- Java开发 微软OAuth身份验证在EWS中的应用
- 关于cuda、cudnn环境配置
- 从人脸识别到唇语识别,图像识别技术发展现状
- 腾讯,迅雷,完美等公司的一些笔试题整理
- 荧光素标记氨基酸,异硫氰酸荧光素FITC标记D-天冬氨酸;FITC-D-Aspartic acid
- 关于编辑Windows的右键【新建】删除和添加
- 开始使用TreeATE
热门文章
- 视频教程-2019年人工智能热门案例精讲之P图美化照片-深度学习
- 论文翻译解读:Translating Embeddings for Modeling Multi-relational Data【TransE】
- python名片制作代码_教你做一张能运行 Python 的名片,成本只要20元!
- 如何将D盘空间压缩并扩展C盘
- springboot基于微信小程序的电器商城系统的设计与实现毕业设计源码251453
- 首个Laravel工作流引擎发布 V1.0正式版
- 数论——唯一分解定理
- python案例:股民福利,采集股票数据~
- 【ROS学习】- tf学习 - tf中重要函数解析 (陆续更新....)
- OpenGL超级宝典学习笔记——操作矩阵