分析new delete 的本质
在程序设计中,数据可能会存在不同的内存空间,如函数栈 堆 全局变量区 ,今天我们来分析一下C++中堆分配方式和C语言的堆分配方式异同,从而更好的理解new delete本质
C语言使用malloc和free来动态分配和释放堆空间,
void * malloc(size_t);
void free(void *);
从函数声明可以看出,使用malloc时,第一:必须显示的把分配的内存空间强制转换成相应的指针类型。第二:必须指定分配字节大小,在不确定基本数据类型字节大小情况下,我们不得不使用sizeof 关键字来计算
int * p=(int *)malloc(sizeof(int)* 4);
free(p);
然而在C++中,一切都简单安全多了。首先我们要了解C++的new和delete关键字是运算符重载operator new operator delete ,在用new时,编译器会自动为我们计算出所需要的字节空间大小而不必我们自己去计算,其次如果new 的对象是类类型而不是基本数据类型,分配完堆空间会调用相应的类构造函数完成初始化工作。
int * p=new int;//随机值
int * p2=new int(5)//初始化为5
Person * p=new Person;//先分配sizeof(Person)大小空间,在调用构造函数初始化对象
Person *p=new Person(4,5);//调用有参构造函数
delete p;//先调用析构函数,在释放空间
使用new为数组分配动态内存堆空间 ,
int *p=new int[5];
Person *pa=new Person[4];
delete []p;
delete []pa;
需要注意的是:用new分配数组不能初始化,且如果数组是基本数据类型,delete [] p ,delete p 可能会产生相同效果,但如果是类类型,delete [] pa,delete pa 是不同的,前者把所有的数组空间都释放掉,而后者仅仅释放到一个对象大小的空间
分析new delete 的本质的更多相关文章
- amazon redshift 分析型数据库特点——本质还是列存储
Amazon Redshift 是一种快速且完全托管的 PB 级数据仓库,使您可以使用现有的商业智能工具经济高效地轻松分析您的所有数据.从最低 0.25 USD 每小时 (不承担任何义务) 直到每年每 ...
- 从软件(Java/hotspot/Linux)到硬件(硬件架构)分析互斥操作的本质
先上结论: 一切互斥操作的依赖是 自旋锁(spin_lock),互斥量(semaphore)等其他需要队列的实现均需要自选锁保证临界区互斥访问. 而自旋锁需要xcmpchg等类似的可提供CAS操作的硬 ...
- "稀奇古怪的"delete this
myClass::foo(){ delete this; } .. void func(){ myClass *a = new myClass(); a->foo(); ...
- String-StringBuffer-StringBuilder的区别和源码分析
一,String,StringBuffer,StringBuilder三者之间的关系 三个类的关系:StringBuffer和StringBuilder都继承自AbstractStringBuilde ...
- 析构中delete this
查看下面代码如何出错 #include <iostream> using namespace std; class A { public: A() { p = this; } ~A() { ...
- jQuery源码分析系列(38) : 队列操作
Queue队列,如同data数据缓存与Deferred异步模型一样,都是jQuery库的内部实现的基础设施 Queue队列是animate动画依赖的基础设施,整个jQuery中队列仅供给动画使用 Qu ...
- MySQL DELETE语句和TRUNCATE TABLE语句的区别
MySQL DELETE语句和TRUNCATE TABLE语句的区别 2010-10-08 16:05 佚名 互联网 字号:T | T 在MySQL数据库中,DELETE语句和TRUNCATE TAB ...
- opencv的实用研究--分析轮廓并寻找边界点
opencv的实用研究--分析轮廓并寻找边界点 轮廓是图像处理中非常常见的.对现实中的图像进行采样.色彩变化.灰度变化之后,能够处理得到的是“轮廓”.它直接地反应你了需要分析对象的边界特 ...
- malloc/free和new/delete的异同
一.基本概念 malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返 ...
随机推荐
- 面向对象高级编程(1)-使用__slots__
使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> ...
- Eclipse – Java.Lang.OutOfMemoryError: Java Heap Space(转)
In Eclipse IDE, if your program is consuming a lot of memory (loading big data) like this : List< ...
- bzoj5210最大连通子块和
题解: 考虑朴素的dp:$$f_{u} = max(\sum_{v} f_{v} + w_{u} , 0) \ \ \ \ h_{u} = max( max_{v} \{ h_{v} \} , h ...
- python图片云
Python 小工具 把图片拼接成任意大小新图片 代码比较简单 看注释就好 # -*- coding:utf-8 -*- #图片拼接 import PIL.Image as Image import ...
- opencv 启动摄像头 C++
http://blog.csdn.net/thefutureisour/article/details/7530177 在网上看了许多关于OpenCV启动摄像头的资料,但是,都是基于C语言的,代码又臭 ...
- SpringCloud微服务实战-Zuul-APIGateway(十)
本文转自:http://blog.csdn.net/qq_22841811/article/details/67637786#准备工作 1 API Gateway 2 Zuul介绍 2.1 zuul的 ...
- intval floatval
intval -- 获取变量的整数值 floatval -- 获取变量的浮点值 <?php $a = ; $b = ; $a/=$b; echo intval($a); echo floatva ...
- Python【网络编程】内置模块urllib
from urllib import request,parseurl = 'http://www.nnzhp.cn'req = request.urlopen(url) #打开一个url,发get请 ...
- Integer两种转int方法比较
方法一: Integer.parseInt(); 返回的是一个 int 的值. 方法二: new Integer.valueof(); 返回的是 Integer 的对象. new Integer.va ...
- python中的文件操作
文件操作时,有'r','w','a'不同的操作类型,其中'r'只能读文件,seek(),tell()函数定位读的起始地方.'w'会清空文件内容然后写文件,seek(),tell()函数定位写的起始地方 ...