文章目录一、C 风格new ↔ deletenew[] ↔ delete[]二、C语言风格malloc/calloc/realloc ↔ free三、释放后的规范指针置空四、常见坑Dev-C里高频出错点五、什么时候需要手动释放一、C 风格new↔deletenew[]↔delete[]✅单个变量 new → delete#includeiostreamusingnamespacestd;intmain(){// 分配堆内存int*pnewint;*p100;// 释放deletep;pnullptr;// 置空防止野指针强烈推荐return0;}✅数组 new[] → delete[] 必须带[]非常重要#includeiostreamusingnamespacestd;intmain(){int*arrnewint[1000000];// 堆数组// 使用数组...delete[]arr;// 释放数组一定要写 []arrnullptr;return0;}❌ 致命错误new[]搭配delete不带方括号会内存异常、程序崩溃二、C语言风格malloc/calloc/realloc↔free#includeiostream#includecstdlib// malloc free头文件usingnamespacestd;intmain(){int*p(int*)malloc(sizeof(int)*1000000);// 使用内存free(p);pnullptr;return0;}C风格malloc 永远用 free不能用deletenew 永远用delete不能free不能混用。三、释放后的规范指针置空deletep;pnullptr;释放后原来的指针不会自动变成NULL仍然指向已经归还的内存称为野指针再次delete p会造成双重释放double free直接崩溃// 错误示例int*pnewint;deletep;deletep;// ❌ 重复释放未置空极易踩坑四、常见坑Dev-C里高频出错点new[] 不能用 deleteint*anewint[100];deletea;// ❌ 错误delete[]a;// ✅ 正确不要释放栈上变量intx;int*px;deletep;// ❌ 崩溃x在栈不是堆不能delete指针被覆盖丢失堆地址 → 内存泄漏int*pnewint[100];pnullptr;// 原来堆的地址丢了再也无法delete内存泄漏一定要保存好new返回的首地址直到释放。五、什么时候需要手动释放函数内new函数退出不会自动释放堆内存voidtest(){int*pnewint[10000];// 堆分配// 没有delete}intmain(){test();// 函数结束p局部指针变量栈销毁但堆内存还占用泄漏}堆内存只有两种回收方式①手动delete/free②整个程序退出操作系统回收全部内存。