1. malloc、calloc、realloc、alloca的区别malloc申请指定字节数的内存。申请到的内存中的初始值不确定。calloc为指定长度的对象分配能容纳其指定个数的内存。申请到的内存的每一位bit都初始化为 0。realloc更改以前分配的内存长度增加或减少。当增加长度时可能需将以前分配区的内容移到另一个足够大的区域而新增区域内的初始值则不确定。alloca在栈上申请内存。程序在出栈的时候会自动释放内存。但是需要注意的是alloca 不具可移植性, 而且在没有传统堆栈的机器上很难实现。alloca 不宜使用在必须广泛移植的程序中。C99 中支持变长数组 (VLA)可以用来替代 alloca。2. malloc()和free()的基本概念以及基本用法2.1. 函数原型及说明void *malloc(long NumBytes)该函数分配了NumBytes个字节并返回了指向这块内存的指针。如果分配失败则返回一个空指针 (NULL)。关于分配失败的原因应该有多种比如说空间不足就是一种。void free(void *FirstByte)该函数是将之前用malloc分配的空间还给程序或者是操作系统也就是释放了这块内存让它重新得到自由。2.2. 函数的用法其实这两个函数用起来倒不是很难也就是malloc()之后觉得用够了就甩了它把它给free()了举个简单例子程序代码char *p (char *)malloc(100 * sizeof(char)); if (p nullptr) { exit(1); } gets(p); free(p); p nullptr;就是这样当然具体情况要具体分析以及具体解决。比如说你定义了一个指针在一个函数里申请了一块内存然后通过函数返回传递给这个指针那么也许释放这块内存这项工作就应该留给其他函数了。2.3. 关于函数使用需要注意的一些地方申请了内存空间后必须检查是否分配成功。当不需要再使用申请的内存时记得释放释放后应该把指向这块内存的指针指向NULL防止程序后面不小心使用了它。这两个函数应该是配对。如果申请后不释放就是内存泄露如果无故释放那就是什么也没有做。释放只能一次如果释放两次及两次以上会出现错误释放空指针例外释放空指针其实也等于啥也没做所以释放空指针释放多少次都没有问题。虽然malloc()函数的类型是(void *)任何类型的指针都可以转换成(void *)但是最好还是在前面进行强制类型转换因为这样可以躲过一些编译器的检查。3. malloc()到底从哪里得来了内存空间malloc()到底从哪里得到了内存空间答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时就会遍历该链表然后就寻找第一个空间大于所申请空间的堆结点然后就将该结点从空闲结点链表中删除并将该结点的空间分配给程序在使用malloc()分配内存空间后一定要记得释放内存空间否则就会出现内存泄漏。free()释放的是指针指向的内存注意释放的是内存不是指针指针并没有被释放指针仍然指向原来的存储空间。指针是一个变量只有程序结束时才被销毁。释放了内存空间后原来指向这块空间的指针还是存在只不过现在指针指向的内容的垃圾是未定义的所以说是垃圾。因此释放内存后把指针指向NULL防止指针在后面不小心又被解引用了。4. malloc()以及free()的机制事实上仔细看一下free()的函数原型也许也会发现似乎很神奇free()函数非常简单只有一个参数只要把指向申请空间的指针传递给free()中的参数就可以完成释放工作这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。大多数实现所分配的存储空间比所要求的要稍大一些额外的空间用来记录管理信息——分配块的长度指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端则会改写后一块的管理信息。这种类型的错误是灾难性的但是因为这种错误不会很快就暴露出来所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。malloc()申请的空间实际就是分了两个不同性质的空间。一个就是用来记录管理信息的空间另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中经常用结构来记录信息下面看看这个结构体的原型程序代码struct mem_control_block { int is_available; //一般来说应该是一个可用空间的首地址但这里英文单词却显示出空间是否可用的一个标记 int size; //这是实际空间的大小 };所以free()就是根据这个结构体的信息来释放malloc()申请的空间而结构体的两个成员的大小我想应该是操作系统的事了。下面看看free()的源代码void free(void *ptr) { struct mem_control_block *free; free ptr - sizeof(struct mem_control_block); free-is_available 1; return; }5. new和delete详解new / new[]完成两件事先底层调用 malloc 分了配内存然后调用构造函数创建对象。delete/delete[]也完成两件事先调用析构函数清理资源然后底层调用 free 释放空间。new 在申请内存时会自动计算所需字节数而 malloc 则需我们自己输入申请内存空间的字节数。5.1. new和delete使用申请内存确认是否申请成功int main() { T* t new T(); // 先内存分配 再构造函数 delete t; // 先析构函数再内存释放 return 0; }5.2. 定位new定位newplacement new允许我们向 new 传递额外的参数。new (palce_address) type new (palce_address) type (initializers) new (palce_address) type [size] new (palce_address) type [size] { braced initializer list }palce_address是个指针initializers提供一个可能为空的以逗号分隔的初始值列表6. delete this 合法吗合法但必须保证 this 对象是通过new不是new[]、不是 placement new、不是栈上、不是全局、不是其他对象成员分配的必须保证调用delete this的成员函数是最后一个调用 this 的成员函数必须保证成员函数的delete this后面没有调用 this 了必须保证delete this后没有人使用了参考文献重磅干货 五万字长文总结 C/C 知识上