山西建设工程协会网站,中国建设网官方网站证书查询,手机网页制作尺寸,房产网站建站动态内存
在C/C程序中#xff08;线程#xff09;栈空间是有限的#xff0c;大部分变量使用的都是动态分配来的堆内存#xff0c;这些动态申请来的堆内存是需要开发者通过代码去自行管理的。如何管理好这些动态申请来的内存#xff0c;是C/C开发中的一个重点难点问题。 m…动态内存
在C/C程序中线程栈空间是有限的大部分变量使用的都是动态分配来的堆内存这些动态申请来的堆内存是需要开发者通过代码去自行管理的。如何管理好这些动态申请来的内存是C/C开发中的一个重点难点问题。 malloc是开空间
calloc开空间初始化
realloc在原来的空间增加空间(原地扩异地扩) int* p1new int 申请一个int空间
int* p2new int[10] 申请十个int空间
int* p3new int(10) 申请一个int空间并初始化
int* p4new int[10]{1,2,3,4}申请10个int空间并依次初始化其余置0 c11才支持 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去调用他 new的底层原理
去调用call operator new call operator new
去调用对应的构造函数 call stack::stack
newoperator 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表达式
定位new表达式是在已分配的原始空间中调用构造函数初始化一个对象
stack obj)stack* operator new(sizeof(stack))
new(obj) stack(4)
使用场景一般配合内存池使用因为内存池分配出来的空间内存没用初始化所以如果是自定义类型的对象需要使用定位new显示调用的构造函数进行初始化 malloc、free和new/delete的区别
相同
malloc/free和new/deletede共同点是都是从堆山申请空间并且需要手动释放
不同
malloc和free是函数new\delete是操作符
malloc申请的空间不会初始化new可以调用构造函数初始化
malloc申请空间时需要手动计算空间大小并传递new只需要在其后跟上空间的类型即可如果是多个对象[]中指定对象个数即可
malloc返回值是void* 在使用时必须强转new不需要因为new后跟的时空间的类型
malloc申请空间时报时返回的是NULL因此使用时必须判定new不需要但new需要捕获异常
申请自定义类型对象时malloc\free只会开辟空间不会调用构造函数与析构函数而new在申请空间后会调用构造函数完成对象初始化delete在释放空间前会调用析构函数完成空间中的资源的清理 内存泄漏
内存泄漏是指针丢了找不到找不到指针释放不了空间。