C++内存管理

文章目录

  • c++内存分布
  • new和delete
  • operator new和operator delete
  • new和delete实现原理
  • mallloc/free与new/delete区别

c++内存分布

C++内存管理_第1张图片
const修饰的变量并不会因为其具有常属性而将其放到常量区,const起的作用只是将其修饰成不可修改而已。

char s[]="abcd";//将常量区的内容复制给数组s
const char *p="abcd";//将指针p指向常量区的内容

new和delete

类似于C语言malloc和free,c++提出了自己的内存管理方式。

int *p1=new int;//开辟一个整型空间,new对内置类型不会初始化
int *p2=new int(11);//开辟一个整型空间并初始化成11
delete p1;
delete p2;//释放空间

int *p3=new int[3];//开辟3个连续的整型空间
int *p4=new int[10]{1,2,3};//开辟10个连续的整型空间并初始化,剩余未初始化的空间初始化成0
delete[] p3;
delete[] p4;//释放空间

需要注意的是,为了避免一些意想不到的错误,new和delete配套使用,new[]和delete[]配套使用,不能混合使用。

由于c++兼容c,因此c的内存管理方式在c++中依旧可以使用,但其不能解决自定义类型的初始化问题,new在为一个自定义类型开辟空间时会调用其构造函数进行初始化,delete在释放自定义类型的空间时也会调用其析构函数来对其内容进行清理。

operator new和operator delete

operator new和operator delete是系统提供的全局函数,new在底层调用了operator new函数来开辟空间,delete在底层调用operator delete函数来实现释放空间。这2个函数用户可以直接使用,但其目的不是为了供用户使用,而是用于new和delete。
operator new的空间申请其实是通过malloc函数实现的,operator delete空间的释放也其实是通过free函数实现的。这样层层封装的主要原因是malloc函数开辟空间失败后会返回0,不符合c++面向对象编程,我们希望空间开辟失败后会抛异常,因此我们就在malloc函数的基础上,加上了一个空间开辟失败抛异常的功能,然后将其封装成operator new函数。operator delete和free没有什么区别,其主要是为了和operator new函数对称。

new和delete实现原理

以下以自定义类型为例:

new原理:
先调用operator new函数开辟空间,再调用构造函数初始化。

delete原理:
先调用析构函数完成对对象中资源的清理,再调用opeartor delete函数释放对象的空间。

new[]原理:
先调用operator new[]函数,再调用N次构造函数对N对象初始化,而operator new[]其实是通过调用operator new函数一次性开辟完N个对象的空间。

delete[]原理:
先调用N次析构函数完成对N个对象中资源的清理,再调用operator delete[]函数释放空间,operator delete[]函数实际又是通过operator delete函数释放空间。

mallloc/free与new/delete区别

1.malloc和free是函数,new和delete是操作符
2.malloc函数申请的空间不能初始化,new可以
3.malloc需要手动计算需要开辟空间的大小,new不需要
4.malloc的返回类型是void*,使用需要类型转换,new不需要
5.malloc空间申请失败返回空指针,使用时要判空,new不需要
6.new可以调用构造函数初始化,delete可以调用析构函数进行资源清理,而malloc和free不能。

你可能感兴趣的:(c++,java,jvm)