new的功能可以被拆解为三步:
一是通过调用malloc分配无类型空间(大小为类的大小)
二是进行指针类型转换
三是调用类的构造函数(赋初值之类的操作)
delete的功能可以被拆解为两步:
一是调用析构函数
二是调用free
delete这里的执行顺序是先析构在free,顺序很重要,否则很有可能会造成内存泄漏:
比如:
x=new string;
delete x;
如果先调用free,那么直接释放的是x这个指针的所占用的空间,那么x所指向的内容就不能被释放
,就会造成内存泄漏。如果先调用析构函数,那么就能够先释放掉所指向的内容,再释放指针的空间。
注:new分配的空间和创建的对象都在堆区,必须用delete去释放。
static 类名 对象名;程序结束才会释放。
关于free和malloc:
实际上malloc分配内存的时候,不只是分配对象所需要的内存,还会多分配关于debug信息的内存,cookie的信息(用来记录分配从哪里开始和从哪里结束),在vc下,由于要求一次分配的内存要是16的倍数,所以还会有一些padding存在。cookie的值是记录着分配的内存块的大小,然后借最后一位来表示这个内存块是分配出去了,还是回收回来,1表示分配,0表示回收。比如图中的cookie为000000041,表示此内存块是被分配出去了的,大小是0000000040。