前几天学习c++的内存管理,new和delete,看的视频大部分都是讲解到底层调用malloc和free。我当时看视频简单的以为malloc就是分配个多大空间的内存,free就是把指针指向的大小释放掉,释放的多少根据指针指向对象的类型判定。但是在写内存池时有一个严重的问题,我malloc(n)的时候多次把指针转换为char*,导致我释放的时候不知道怎么根据char来释放掉这个大小为n的内存块。因为free传递的参数只有一个void指针。
后来我尝试搜了一些资料,发现,malloc和free在分配内存的时候其实是有两块的,一块是咱们平常直接见到的内存部分,一块是用来管理该内存的部分。也就是说实际分配的内存为:用户申请的大小+管理头的大小。释放的时候,会根据你指向的部分,借助管理头的数据,释放掉当时申请的内存大小。
char* p = (char*) malloc(10);
free(p);
释放p的时候,不会是单纯的释放掉一个char大小的内存,而是释放掉10个char大小的内存。因为对于malloc和free来说,这10个就是绑定在一起的,一起申请,一起释放。