在C/C++程序中(线程)栈空间是有限的,大部分变量使用的都是动态分配来的堆内存,这些动态申请来的堆内存是需要开发者通过代码去自行管理的。如何管理好这些动态申请来的内存,是C/C++开发中的一个重点难点问题。
malloc是开空间
calloc开空间+初始化
realloc在原来的空间增加空间(原地扩+异地扩)
int* p1=new int 申请一个int空间
int* p2=new int[10] 申请十个int空间
int* p3=new int(10) 申请一个int空间,并初始化
int* p4=new int[10]{1,2,3,4}申请10个int空间,并依次初始化,其余置0 c++11才支持
delete p1
delete[] p2
delete p3
delete[] p4
对于内置类型而言,用malloc和new,除了用法不同,其余都是相同
他们的区别在于自定义类型
malloc只开空间,new开空间+调用构造函数
new、delete与malloc、free的区别在于new会调用构造函数,delete会调用析构函数,而malloc、free不会
new先开自定义类型空间,再调用构造函数,对其初始化
delete先清理初始化的空间,再对自定义类型进行释放
malloc失败,返回空指针
new失败,抛异常
operator new与malloc的功能是一样的,但operator new失败会抛异常
operator new是封装了malloc加了个抛异常,让new去调用他
去调用call operator new call operator new
去调用对应的构造函数 call stack::stack
new=operator new+构造函数
new原理
调用operator new函数申请空间,在申请空间上执行构造函数,完成对象的构造
delete原理
在空间上执行析构函数,在operator delete函数释放空间的空间
new[]原理
1.调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间申请,在申请的空间上执行N次构造函数
delete原理
1.在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
2.调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间
定位new表达式是在已分配的原始空间中调用构造函数初始化一个对象
stack obj=)stack* operator new(sizeof(stack))
new(obj) stack(4)
使用场景,一般配合内存池使用,因为内存池分配出来的空间内存没用初始化,所以如果是自定义类型的对象,需要使用定位new显示调用的构造函数进行初始化
相同
malloc/free和new/deletede共同点是:都是从堆山申请空间,并且需要手动释放
不同
malloc和free是函数,new\delete是操作符
malloc申请的空间不会初始化,new可以调用构造函数初始化
malloc申请空间时,需要手动计算空间大小并传递,new只需要在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可
malloc返回值是void* 在使用时必须强转,new不需要,因为new后跟的时空间的类型
malloc申请空间时报时,返回的是NULL,因此使用时必须判定,new不需要,但new需要捕获异常
申请自定义类型对象时,malloc\free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象初始化,delete在释放空间前会调用析构函数完成空间中的资源的清理
内存泄漏是指针丢了找不到,找不到指针释放不了空间。