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底层解析相关推荐

  1. Redis 数据类型之(底层解析)

    Redis 数据类型之(底层解析) Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redi ...

  2. 第四篇:由浅入深,虚拟机常量池底层解析

    文章目录 一.前言 二.常量池的引入:从常量到常量池 2.1 常量 2.2 Class文件中的常量池 2.3 方法区中的运行时常量池 2.4 常量池的好处 三.常量池的介绍:JVM三种常量池 3.1 ...

  3. YYModel底层解析- Runtime

    这段时间一直在忙新的需求,没有时间来整理代码,发表自己技术博客,今天我们来看一下YYModel的底层解析以及如何使用,希望对大家有所帮助! 一 概述 概括 YYModel是一个轻量级的JSON模型转换 ...

  4. element 往node里面增加属性值_HashMap加载因子为何0.75,为何初始化值2的指数幂,底层解析...

    01 前言 我们在声名HashMap的时候,一般都会这样写. public class MapTest { public static void main(String[] args) { HashM ...

  5. delete 语句解析与执行

    代码传送门: 3.1.2 参考代码(解析) 3.2.3 参考代码(执行) 3.1 delete 语句的解析 3.1.1 解析 sql 语句需要了解一些分词器和解析器 简要流程: 匹配 delete : ...

  6. c++ new[] delete[]底层分析

    先写一个demo,里面有new[],delete[],使用C++11 MTd选项编译: #include <string> int main() {auto pS = new std::s ...

  7. delete用法解析

    使用delete语句一次只能删除整行记录,不能删除某个字段. (属于DML 语句会有提示是否删除). delete只会删除记录,不会删除表. 注: 如果要删除整张表,需要使用drop table命令. ...

  8. iOS 底层解析weak的实现原理

    weak表是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址数组.weak是弱引用,所引用对象的计数器不会加一,并在引用对象被释放的时候自动被设置为nil.通常用于解决循 ...

  9. SpringBoot文件上传源码解析

    一.SpringMVC文件上传源码分析前言(这部分我觉得原作者写的很好) 该如何研究SpringMVC的文件上传的源码呢? 研究源码并不是仅仅知道程序是怎样运行的,而应该从宏观的角度.不同的立场去看待 ...

最新文章

  1. 区块链系列4-智能合约
  2. Linux进程地址空间学习总结
  3. JDBC原理之层次结构
  4. 字符串类习题、面试题详解(第二篇)
  5. Development cannot be enabled while your device is locked.
  6. 201671010135 《面向对象程序设计课程学习进度条》
  7. 传智播客 C/C++学习笔记 数组和指针的关系, 字符串学习
  8. #入坑keychron# 简单说说K3的使用体验
  9. PHP语法基础篇——除法取整和取余数
  10. 2020年SEM小搜投放指南:竞价小渠道如何把效果做到极致
  11. 瘦手臂最快最有效的方法
  12. mysql 13位时间戳转时间戳_时间戳换算(13位时间戳转换工具 在线)
  13. pps服务器没有响应,为什么pps服务器未响应,停止播放我家用的是Avira AntiVir 控制中心...
  14. ui设计移动端字体适配_移动端字体ui设计 移动端界面设计规范
  15. P2V迁移(Centos7整机业务迁移到ESXI7.0)
  16. freemarker自定义指令及方法
  17. 20个设计模式和软件设计面试问题
  18. winform实现发票打印功能
  19. 【深度学习】知乎高赞:深度学习如何调参?
  20. 我的青春我做主王珞丹一周时尚日记

热门文章

  1. 初始python(二)
  2. ubuntu安装(owncloud-docker安装)
  3. Nginx在Windows系统和Linux系统下的重启
  4. PhantomJS快速入门教程(转)
  5. can't find a register in class `GENERAL_REGS' while reloading `asm'
  6. 如何验证c++代码线程安全性_Python3基础:如何验证你的代码
  7. 3.9 YOLO算法-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  8. android文章链接
  9. 不忘初心helloworld,IMX6入门学习笔记
  10. 编程格式注意事项---后期慢慢补充