使用动态内存常见错误总结
一 申请的内存多次释放
#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;
}