分析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 是不同的,前者把所有的数组空间都释放掉,而后者仅仅释放到一个对象大小的空间