new和delete底层解析
new和delete底层解析
2018年04月05日 10:26:44 龙跃十二 阅读数:205 标签: C++newdelete 更多
个人分类: C++
所属专栏: C++
版权声明:本文为博主原创文章,转载请私信博主。 https://blog.csdn.net/qq_38646470/article/details/79824464
- 1.new/delete 和operator new/operator delete和malloc/free的关系
- 2.new时底层处理的机制
- 3.new/delete和malloc/free的区别
1.new/delete 和operator new/operator delete和malloc/free的关系
先写个栗子看看new和delete的用法:
int main()
{int *p0 = new int;int *p1 = new int(10);int *p2 = new int[10];int *p3 = (int *)malloc(sizeof(int)*10);delete p0;delete p1;delete[] p2;free(p3);return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
再看看他们之间的关系:
2.new时底层处理的机制
3.new/delete和malloc/free的区别
1)malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符
malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。
2)用法上也有所不同。
函数malloc 的原型如下:
void * malloc(size_t size);
● malloc 申请一块长度为size 个字节
● malloc 返回值的类型是void ,所以在调用malloc 时要显式地进行类型转换,将void 转换成所需要的指针类型。
● malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。
函数free 的原型如下:
void free( void * memblock );
● 如果p 是NULL 指针,那么free对p 无论操作多少次都不会出问题。
● 如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。
运算符new 使用起来要比函数malloc 简单得多,例如:
int p1 = (int )malloc(size);
int *p2 = new int[size];
● new 内置了sizeof、类型转换和类型安全检查功能。
● 对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作。
● 如果对象有多个构造函数,那么new 的语句也可以有多种形式。
在用delete 释放对象数组时,留意不要丢了符号‘[]’。例如
● delete []p2; // 正确的用法
● delete p2; // 错误的用法
后者相当于delete p2[0],漏掉了另外size-1个对象。
说来说去我们要明白new的底层是调用malloc,delete底层调用的是free。在c++中我们使用时要明白二者的区别和联系。在使用new时一定用delete释放,用malloc时一定用free释放,这样匹配防止程序以外崩溃。
new和delete底层解析相关推荐
- Redis 数据类型之(底层解析)
Redis 数据类型之(底层解析) Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redi ...
- 第四篇:由浅入深,虚拟机常量池底层解析
文章目录 一.前言 二.常量池的引入:从常量到常量池 2.1 常量 2.2 Class文件中的常量池 2.3 方法区中的运行时常量池 2.4 常量池的好处 三.常量池的介绍:JVM三种常量池 3.1 ...
- YYModel底层解析- Runtime
这段时间一直在忙新的需求,没有时间来整理代码,发表自己技术博客,今天我们来看一下YYModel的底层解析以及如何使用,希望对大家有所帮助! 一 概述 概括 YYModel是一个轻量级的JSON模型转换 ...
- element 往node里面增加属性值_HashMap加载因子为何0.75,为何初始化值2的指数幂,底层解析...
01 前言 我们在声名HashMap的时候,一般都会这样写. public class MapTest { public static void main(String[] args) { HashM ...
- delete 语句解析与执行
代码传送门: 3.1.2 参考代码(解析) 3.2.3 参考代码(执行) 3.1 delete 语句的解析 3.1.1 解析 sql 语句需要了解一些分词器和解析器 简要流程: 匹配 delete : ...
- c++ new[] delete[]底层分析
先写一个demo,里面有new[],delete[],使用C++11 MTd选项编译: #include <string> int main() {auto pS = new std::s ...
- delete用法解析
使用delete语句一次只能删除整行记录,不能删除某个字段. (属于DML 语句会有提示是否删除). delete只会删除记录,不会删除表. 注: 如果要删除整张表,需要使用drop table命令. ...
- iOS 底层解析weak的实现原理
weak表是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址数组.weak是弱引用,所引用对象的计数器不会加一,并在引用对象被释放的时候自动被设置为nil.通常用于解决循 ...
- SpringBoot文件上传源码解析
一.SpringMVC文件上传源码分析前言(这部分我觉得原作者写的很好) 该如何研究SpringMVC的文件上传的源码呢? 研究源码并不是仅仅知道程序是怎样运行的,而应该从宏观的角度.不同的立场去看待 ...
最新文章
- 区块链系列4-智能合约
- Linux进程地址空间学习总结
- JDBC原理之层次结构
- 字符串类习题、面试题详解(第二篇)
- Development cannot be enabled while your device is locked.
- 201671010135 《面向对象程序设计课程学习进度条》
- 传智播客 C/C++学习笔记 数组和指针的关系, 字符串学习
- #入坑keychron# 简单说说K3的使用体验
- PHP语法基础篇——除法取整和取余数
- 2020年SEM小搜投放指南:竞价小渠道如何把效果做到极致
- 瘦手臂最快最有效的方法
- mysql 13位时间戳转时间戳_时间戳换算(13位时间戳转换工具 在线)
- pps服务器没有响应,为什么pps服务器未响应,停止播放我家用的是Avira AntiVir 控制中心...
- ui设计移动端字体适配_移动端字体ui设计 移动端界面设计规范
- P2V迁移(Centos7整机业务迁移到ESXI7.0)
- freemarker自定义指令及方法
- 20个设计模式和软件设计面试问题
- winform实现发票打印功能
- 【深度学习】知乎高赞:深度学习如何调参?
- 我的青春我做主王珞丹一周时尚日记
热门文章
- 初始python(二)
- ubuntu安装(owncloud-docker安装)
- Nginx在Windows系统和Linux系统下的重启
- PhantomJS快速入门教程(转)
- can't find a register in class `GENERAL_REGS' while reloading `asm'
- 如何验证c++代码线程安全性_Python3基础:如何验证你的代码
- 3.9 YOLO算法-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- android文章链接
- 不忘初心helloworld,IMX6入门学习笔记
- 编程格式注意事项---后期慢慢补充