使用动态内存常见错误总结
一 申请的内存多次释放
#include <iostream>
using namespace std;
int main()
{
int* p = new int[5];
*(p+0) = 0;
cout << *(p + 0) << endl;
delete[] p;
//... 此处省略n行代码
int a = 0;
//...
delete[] p; // 这里又释放一次
cout << "come here" << endl;
return 0;
}
运行结果,控制台上并没有打印出come here
二 内存泄露
忘记delete,会造成内存泄露
三 释放的内存不是申请时的地址
#include <iostream>
using namespace std;
int main()
{
int* p = new int[5];
for (int i = 0; i < 5; i++)
{
*(p++) = i;
}
delete[] p; // for循环的时候用的p++,for循环结束后p的指向不是指向申请内存时的地址了
cout << "come here" << endl;
return 0;
}
四 释放空指针
#include <iostream>
using namespace std;
int main()
{
int* p = NULL;
if (1 == 0) // 比如文件能打开的情况
{
p = new int[1024];
}
delete[] p; // 这里直接假设的if条件能够成立,能够new到1024个int
cout << "come here" << endl;
return 0;
}
五 释放一个内存块,但继续引用其中的内容
#include <iostream>
using namespace std;
int main()
{
int* p = new int[5];
*(p + 0) = 1;
delete[] p;
// 释放一个内存块,但继续引用其中的内容
*(p + 1) = 2;
cout << "come here" << endl;
return 0;
}
控制台没有输出come here
六 越界访问
#include <iostream>
using namespace std;
int main()
{
int* p = new int[5];
memset(p, 0, 5 * sizeof(int)); // 初始化
for (int i = 0; i < 5; i++)
{
cout << *(p++) << endl;
}
// 访问越界
for (int i = 0; i < 5; i++)
{
cout << *(p++) << endl;
}
delete[] p;
cout << "come here" << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本