malloc、free、new、delete

一、malloc和free

malloc是一个函数,函数原型为:

extern void*malloc(unsigned int num_bytes);分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

void *malloc(int size);malloc 向系统申请分配指定size个字节的内存空间,返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

free函数的原型为:void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。传入的参数为malloc返回的首地址,当使用malloc时,操作系统会记录malloc申请的首地址和地址范围,当使用free释放时,首地址必须是一定的,并且会释放一段内存。

注意事项:

1.申请内存空间后,必须检查是否分配成功,因为malloc申请内存失败并不会抛出一个异常,而是会返回一个NULL指针;

2.当不在需要申请的内存空间时,需要手动释放,并且将指针指向NULL,避免误操作;

3.malloc和free是成对出现的,如果使用了malloc而没有使用free则会造成内存泄露,如果多次释放则可能会出现错误;

4.malloc函数的返回值为void*,void*可以转换为任意类型的指针,一般会在前面进行强制类型转换,避免编译器报错。

5.malloc和free到底做了哪些事情;

a.当调用malloc函数时,系统内核会从空闲的内存(一般会使用特定的数据结构来存储)当中选出一块相应大小的内存与指针绑定,并且将选中的这块内存从保存空闲的内存数据结构当中提出;

b.当调用free函数时,free函数会将malloc绑定的内存与指针解除绑定,并重新将这块内存放入到存放空闲内存的数据结构当中,但是并不会将内存当中的数据进行清除,因此堆内存都是脏的,释放后仍然能被malloc绑定的指针访问,因此一般在free之后将指针重新指向NULL,避免产生野指针。

二、new和delete

new是运算符,动态创建对象时,只需要指定数据类型,返回值是完整的类型指针;并且当new失败后会抛出一个异常(即一个中断,程序会自动跳转到相应中断的地址中去执行,一般中断地址会与一个中断处理函数的指针来绑定,跳转到相应的中断函数中去执行);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章