1.C/C内存分布栈局部普通变量局部数组指针变量本身堆malloc. realloc calloc开辟出来的内存。(*指针指向的那块空间。)静态区数据段全局变量存放变量 → 内容可以读写常量区代码段/只读段 存放字面常量 → 内存只读不能修改如果在一行代码前面加了const那这个指针指向的内容不可变只能读所以就在常量区。2.C语言中动态内存管理方式malloc. realloc callocmalloc不会初始化内存在堆上开辟size字节内存。参数只传总字节数。calloc自动把全部内存初始化为0相当于mallocmemset在堆上开辟num个每个占size字节的空间。参数元素个数单个元素字节大小。realloc扩容已经在堆上分配好的内存快参数。分为原地扩容和异地扩容。异地扩容的时候会把旧内存的数据拷贝到新内存自动释放旧内存。参数原来老内存块的指针新的总字节大小。在这里需要Free p3不需要Free p2。如果realloc是原地扩容那么你p2再释放一次就释放了两次是程序崩溃的。如果它是异地扩容的话它要指向一个新内存它还会自动把旧内存释放掉。3.C内存管理方式new deletenew关键字自动调用构造函数。delete关键字自动调用机构函数。而malloc和free不会调用operator new和operator delete是全局函数operator new 是c语言的mallocC版本只负责开辟原始堆内存不调用构造函数。operator delete只负责把内存还给堆不会调用析构函数。通俗类比operator new 只租毛坯地皮不装修new A 关键字租地皮 上门装修调用构造new关键字本身就依赖operator new函数。不是额外多出来的东西是new关键字底层依赖的工具函数。new失败处理为抛异常bad_allocnew / delete 是关键字是一套完整流程分配内存构造 / 析构释放内存operator new / operator delete 是底层内存函数专门只做内存的申请/归还。通俗说妈妈管钱给爸爸午饭钱20,妹妹零花钱一天3块这算OK但哥哥上大学花钱比较高频三餐钱每次给日常生活用品钱也要给非常麻烦所以妈妈每月直接转1500(相当于operator-底层内存每次从这取就比较方便4.定位new表达式定位new 不会分配内存它只在一块已经开好的原始内存上调用构造函数把这块裸内存变成一个对象。普通 new A 是两步1. operator new 申请堆内存2. 调用构造函数定位new跳过第一步申请内存只做第二步调用构造函数。注最后要手动调用析构函数不能用delete内存单独free因为这块内存不一定是new来的通俗比喻malloc 租一间空毛坯房只有空间没有家具不是“可以入住的家”-定位 new(p1)A 上门装修摆放家具调用构造函数毛坯房变成能住的家。不会再重新租房​p1-~A() 搬家、清空屋内东西析构析构不一定释放空间只是清理资源​ free(p1) 把空房子退还给房东普通 new A 一次性【租房 装修】全包套餐。定位new房子你自己提前租好它只负责装修。定位new大多配合内存池使用内存池预先一次性申请一大片堆内存malloc。这片内存只是空白内存没有对象。当我们需要对象的时候从内存池拿一块空白内存用定位new调用构造。用完手动调用析构内存放回内存池不直接free还给操作系统。好处减少频繁malloc带来的开销降低内存碎片。问某些时候new[]数组会额外多分配4个字节为什么答Date* p new Date[10];delete[] p; 的时候编译器不知道数组有多少个元素。单个对象 delete p 只调用1次析构​数组 delete[] p 必须循环调用N次析构函数N就是数组元素数量所以 new[] 在数组内存最前面偷偷放了一个整数4字节记录数组元素个数 N10 。[ 4字节计数N10 ][ Date0 ][ Date1 ] ... [Date9 ]↑ ↑隐藏头 p指向这里注这个计数头只有当类拥有自定义析构函数的时候才会分配如果类没有析构函数编译器不需要调用析构就不用存数量不会额外开辟这4字节。例 int *p new int[10]; 很多编译器不会多加4字节只分配40字节。因为int没有析构delete[]不需要循环调用析构。