目录
引入
new与delete关键字( *** 作符)
new关键字的作用:
new关键字的两种用法
delete的作用:
delete的使用:
operator new 和operator delete 函数
operator new 和operator delete 重载
new 和delete 与malloc和free的区别与联系
定位new表达式(placement-new)
引入
为什么 *** 作系统在设计的时候,需要将完整的内存空间划分为不同的区域?
为了方便 *** 作系统对内存的管理
c语言中我们已经学习了通过malloc/calloc/realloc申请空间,为什么c++还要提出自己的内存管理方式?
c语言中的内存管理方式在c++中我们依然可以使用,但对有些地方就显得 *** 作繁琐,或者无能为力,因此基于这种现状,c++又提出了自己的内存管理方式。
(通过new和delete关键字( *** 作符)来实现动态内存管理)
new与delete关键字( *** 作符) new关键字的作用:在内存中申请空间
new关键字的两种用法方法一:申请单个空间
申请单个空间时可以初始化
int main(){
int *p1 = new int;
int *p2=new int(10);//可以初始化
delete p1;
delete p2;
system("pause");
return 0;
}
方式二:申请一个连续空间
int main(){
int *p1 = new int;
int *p2=new int(10);//可以初始化
int *p3 = new int[20];
delete p1;
delete p2;
dltete[] p3;
system("pause");
return 0;
}
delete的作用:
释放申请的内存空间。
delete尽量和new搭配使用,new[ ]和delete[ ]搭配使用
operator new 和operator delete 函数new和delete都是用户进行动态内存申请的释放 *** 作符
operator new 和operator delete 是系统提供的全局函数,
new 和delete实现对应功能实际上是底层对operator new operator 的调用
这里我用VS2013编译器查看了两个函数的底层代码
由上面new和delete的函数实现来看,new/delete的实现是对malloc/free的一种封装
operator new 和operator delete 重载该函数可以重新实现,一般不需要重载,直接使用库里的就行。
因为c++的编译者已经替我们重载过了。
除非使我们有特殊需求:检查内存泄漏、调试代码等。
联系:
new/delete的实现是对malloc/free的一种封装
malloc/delete/malloc/free都是在堆上申请空间的,并且都需要用户的手动释放
区别
1.malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可
2.malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
3.对于内置类型来说
new和malloc在申请存储内置类型空间时类似,区别是malloc在申请不到空间时会返回空,因此必须要判空,new则是报告异常
对于自定义类型来说,
new在申请空间后,会调用类中的构造函数将空间初始化成一个真正的对象
delete在释放空间时,会先调用类中的析构函数,将对象中的资源给释放掉,然后再去释放对象的空间
malloc只负责将类类型对象所需要的空间给申请成功,并不会调用构造函数对空间进行初始化,
free只负责将空间释放掉,并不会调用构造函数将空间中所指向的资源给清除掉。
因此,在内置类型申请释放中,new delete malloc free 我们是否匹配使用,并不会造成内存泄漏或者崩溃当类中涉及到资源的管理的时候,我们只能使用new 和delete 如果我们不匹配使用或者直接使用malloc free 可能会造成程序的崩溃或很严重的内存泄漏。
概念
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。
使用格式:
new (place_address) type或者new (place_address) type(initializer-list)
place_address必须是一个指针,initializer-list是类型的初始化列表
使用场景:
定位new表达式在实际中一般是配合内存池使用。
因为内存池分配出的内存没有初始化,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)