<七>深入理解new和delete的原理
new ,delete 运算符
int *p =new int;
delete p;
看一下汇编代码

可以看到new 和delete 运算符其实也是 operator运算符重载函数的调用
malloc和new
malloc 按字节开辟内存 new在开辟内存的时候需要指定类型 new int[10]
malloc 返回的是 void * 而 operator new 会帮助 转为 int *
malloc只负责开辟空间, new 不仅仅有malloc的功能,可以进行数据的初始化 new int(20) new int100;
malloc 开辟失败返回nullptr指针, new 开辟失败 是抛出 bad_alloc的异常
try{
int *p=new int;
delete p;
}catch(const bad_alloc & err){
cerr<<err.what()<<endl;
}
free和 delete
delete:调用析构函数 再 free()
new -> operator new
delete ->operator delete
//先调用operator new 开辟内存空间,然后调用对象的构造函数(初始化)
void * operator new(int size){
void *p=malloc(size);
if(p==nullptr){
throw bad_alloc();
}
return p;
}
//delete p :调用p指向的对象的析构函数,再调用operator delete 释放内存空间
void operator delete(void * p){
free(p);
}
//针对数组用得new
void * operator new[](int size){
void *p=malloc(size);
if(p==nullptr){
throw bad_alloc();
}
return p;
}
//针对数组用得delete
void operator delete[](void * p){
free(p);
}
new 和 delete ; new[] delete[] 能混用吗?
class student{
public:
student(int age):page(new int(age)){
}
~student(){
delete page;
}
private:
int * page;
}
sutdent *ps=new student(20);
delete ps;//student 会被析构
delete [] ps;//执行报错
sutdent *ps2=new student[20];
delete []ps2; //20个student 会被析构
delete ps2;//执行报错

从上图中可以看到 Test * p=new Test[5]; 编译器会申请 4+ 5 *4 =24个字节空间 前4个用于存储对象个数信息
第5到第24个用于存储对象信息, 在delete [] p的时候,编译器发现了[],会去头4个字节中取出对象个数,然后再
第5个自己到第20个字节按照每4个字节为一个对象进行 对象的析构函数的调用,最后 free(0x100);
所以
Test *p =new Test;
delete [] p ;//运行时会报错, 除了析构p地址外,还会 free(p-4);这就有问题 因为 Test *p=new Test 只是一个对象
时,不会产生前面4个字节的辅助信息
Test *p =new Test[5];
delete p; 只会析构p所指向地址的对象 0x104, free(0x104), 正确的是free(0x100) 所以运行报错
自定义的类类型,有析构函数,为了调用正确的析构函数,那么开辟的对象数组的时候,会多开辟4个字节,记录对象的个数
<七>深入理解new和delete的原理的更多相关文章
- 怎么理解impala(impala工作原理是什么)
下面给大家介绍怎么理解impala,impala工作原理是什么. Impala是hadoop上交互式MPP SQL引擎, 也是目前性能最好的开源SQL-on-hadoop方案. 如下图所示, impa ...
- 深入理解Kafka核心设计及原理(四):主题管理
转载请注明出处:https://www.cnblogs.com/zjdxr-up/p/16124354.html 目录: 4.1创建主题 4.2 优先副本的选举 4.3 分区重分配 4.4 如何选择合 ...
- 深入理解Kafka核心设计及原理(五):消息存储
转载请注明出处:https://www.cnblogs.com/zjdxr-up/p/16127749.html 目录: 5.1文件目录布局 5.2消息压缩 5.3日志索引 5.4日志文件及索引文件分 ...
- titit. 深入理解 内聚( Cohesion)原理and attilax大总结
atitit. 深入理解 内聚( Cohesion)原理and attilax大总结 1.1. 内聚的概念 1 1.1.1. 高内聚模式关于这个问题给出的答案是:分配职责,使其可保持 ...
- (七)理解angular中的module和injector,即依赖注入
(七)理解angular中的module和injector,即依赖注入 时间:2014-10-10 01:16:54 阅读:63060 评论:1 收藏:0 [点 ...
- 【T-SQL进阶】02.理解SQL查询的底层原理
本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...
- 深入理解Redis主键失效原理及实现机制(转)
原文:深入理解Redis主键失效原理及实现机制 作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Redis 也不例外.在 Redis 提供的诸多命令中,EXPIRE.EXPIREA ...
- 理解SQL查询的底层原理
阅读目录 一.SQL Server组成部分 二.查询的底层原理 本系列[T-SQL]主要是针对T-SQL的总结. T-SQL基础 [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- 深入理解Logger日志——框架绑定原理
深入理解Logger日志--框架绑定原理 说到Logger日志的动态绑定,主要归功与Slf4j,在之前的文章也说过,Slf4j是类似于Apache Common-Logging,英文为Simple L ...
- 深入理解Kafka核心设计及原理(三):消费者
转载请注明出处:https://www.cnblogs.com/zjdxr-up/p/16114877.html 深入理解Kafka核心设计及原理(一):初识Kafka 深入理解Kafka核心设计及原 ...
随机推荐
- docker_命令总结
docker -v /hostDir:/containerDir /hostDir为宿主机的目录 /containerDir为容器内的目录 -v 实现两个目录的挂在,即容器内数据持久化到本机 dock ...
- 引擎之旅 Chapter.2 线程库
预备知识可参考我整理的博客 Windows编程之线程:https://www.cnblogs.com/ZhuSenlin/p/16662075.html Windows编程之线程同步:https:// ...
- 【Spring】Spring bean中id和name的差异
id和name都是spring 容器中中bean 的唯一标识符. id: 一个bean的唯一标识 , 命名格式必须符合XML ID属性的命名规范 name: 可以用特殊字符,并且一个bean可以用多个 ...
- 7.第六篇 二进制安装 kube-apiserver
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483812&idx=1&sn=e6773e56 ...
- Elasticsearch:Java 运用示例
在今天的文章中,我们来介绍如何使用Java来访问Elasticsearch. 首先,我们必须在我们的系统中安装Elasticsearch. Maven 配置 针对Java的开发,我们必须在pom.xm ...
- Portainer 基本功能介紹之升級映像檔並更新 Container
文档地址:https://www.asustor.com/zh-tw/online/College_topic?topic=145#dpt7
- Mapping
dynamic针对的是新增的字段,不是对mapping中已有的字段 (原有mapping中的字段不受影响,只影响新增的字段) 当dynamic被设置成false的时候,存在新增字段可以被写入到索引文件 ...
- Docker Compose配置文件详解(V3)
Docker Compose配置文件是Docker Compose的核心,用于定义服务.网络和数据卷.格式为YAML,默认路径为./docker-compose.yml,可以使用.yml或.yaml扩 ...
- Gitlab添加K8S集群
介绍如何在Gitlab项目中添加K8S集群,以便使用K8S集群部署gitlab-runner帮我们运行gitlab的CI/CD. 参考官方文档:https://docs.gitlab.com/ee/u ...
- Node.js(五)学生管理CRUD
npm init -y(初始化项目) npm install express(引入express) npx express-generator -e(自动生成模板.添加对 ejs 模板引擎的支持) n ...