C++内存管理
C语言动态内存分配有malloc、free等。C++则是有New和Delete
New
首先,相比C语言,C++的动态内存分配使用起来相对较为简洁
第二个则是分配10个int类型的空间
new和delete是专门为自定义类型而设计的,malloc只会开空间,new还会调用自定义类型的构造函数进行初始化,delete还会调用析构函数
这有一道题
析:
globalVar是个全局变量,全局变量通常放在静态区
staticGlobalvar是个静态全局变量,也通常放在静态区
staticVar是局部的静态变量,也是放在静态区的
localVar是局部变量,是放在栈上面的
num1是数组名,代表整个数组,也是存放在栈上面的
char2和num1一样都是数组名,所以它也是存放在栈上面的
ptr1是局部变量,是随着栈帧走的,所以是存放在栈上面
pchar3是一个局部变量,是存放在栈上面的,而*pchar3则是指pchar3所指向的那块空间,是存放在常量区的
*ptr是指ptr1指向的那段空间,是在堆上面
*char2也是在栈上面,字符串确实是存放在常量区的,但是这里表示的意思是讲字符串存放进数组里,而*char也表示首元素的地址,数组开好后就放在了栈上面,所以*char就是存放在栈上面的
new的讲解
使用new的过程中也是可以初始化的
初始化也会略有不同
假如是开辟了一个数组,那就可以这样初始化
malloc和new两种开辟空间的函数要和释放空间的函数对应使用
malloc就使用free释放
new就使用delete释放
operator new 和operator delete
operator new 和operator delete本质上是new和delete的封装
但是和malloc本身还是不一样,operator new失败了后会抛异常,而malloc失败了后会返回空指针
假如是开辟了一个数组,那就要使用delete[]
因为系统在开辟空间时会多开4个字节,来存储要调用多少次构造函数,在delete时,指针本来指向数组的首位,这时就会向前移动四个字节,取出里面的数字,就能得出要调用多少次析构函数了
malloc/free和new/delete之间的区别
定位new
针对已经有的空间去进行开空间或者初始化
刚刚的初始化就是构造函数的显式调用
这个是析构函数的显式调用
内存池
因为有频繁申请内存的需要,而堆内存调用又特别慢,所以就有了内存池,内存池会提前申请一大块内存,供程序使用
所以有时候为了节省时间,开辟空间会找malloc去申请内存,但是申请出来的空间没有初始化,所以就要用到定位new去初始化