<七>深入理解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核心设计及原 ...
随机推荐
- Linux_ps总结
ps命令用于监测进程的工作情况.进程是一直处于动态变化中,而ps命令所显示的进程工作状态时瞬间的 使用方式: ps [options] 常用参数 -A 显示所有进程 -a 显示现行终端机下的所有进程, ...
- 【读书笔记】C#高级编程 第十章 集合
(一)概述 数组的大小是固定的.如果元素个数是动态的,就应使用集合类. List<T>是与数组相当的集合类.还有其它类型的集合:队列.栈.链表.字典和集. (二)列表 1.创建列表 调用默 ...
- ViewBinding 与 Kotlin 委托双剑合璧
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭 ...
- 使用 Elastic 技术栈构建 K8S 全栈监控 -4: 使用 Elastic APM 实时监控应用性能
文章转载自:https://www.qikqiak.com/post/k8s-monitor-use-elastic-stack-4/ 操作步骤 apm-servver连接es使用上一步创建的secr ...
- Kubernetes 日志:搭建 EFK 日志系统
Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch.Fluentd 和 Kibana(EFK)技术栈,也是官方现在比较推荐的一种方案. Elasticsearch 是一个 ...
- 使用 Dockerfile 的一些最佳实践
- nginx配置文件内容详解
events { # 服务器最大链接数 worker_connections 1024; # 设置一个进程是否同时接受多个网络连接,默认为off multi_accept on; #事件驱动模型,se ...
- mvn clean package 、mvn clean install、mvn clean deploy的区别与联系
使用的时候首选:mvn clean package mvn clean package依次执行了clean.resources.compile.testResources.testCompile.te ...
- 举例:Network Policies
本文描述了如何在 Kubernetes 集群中通过创建 NetworkPolicy 的方式来声明网络策略,以管理 Pod 之间的网络通信流量. 前提条件 创建一个Deployment并配置Servic ...
- Java Maven项目之Nexus私服搭建和版本管理应用
转载自:https://cloud.tencent.com/developer/article/1010603 1.Nexus介绍 Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓 ...