1 对NULL指针的解引用操作
没有判断是否成功开辟内存,没开辟成功的话,直接对返回的NULL指针进行解引用操作。
int* p = (int*)malloc(10 * sizeof(int));
*p = 20;
free(p);
2 对动态开辟的内存的越界访问
int* p = (int*)malloc(5 * sizeof(int));
if (p == NULL) {
printf("%s", strerror(errno));
}
else {
for (int i = 0; i < 10; i++) {
*(p + i) = i;
}
}
free(p);
p = NULL;
3 对非动态开辟的内存进行free操作
int a = 0;
int* p = &a;
free(p);
p = NULL;
4 使用free释放动态开辟内存的一部分
int* p = (int*)realloc(NULL, 50);
if (p == NULL) {
return 0;
}
for (int i = 0; i < 5; i++) {
*p++ = i;
}
free(p);
p = NULL;
在代码执行后,p会指向申请空间的后面,再进行free操作就会出错
5 对同一块动态内存多次释放
int a = 0;
int* p = (int*)realloc(NULL, 50);
if (p == NULL) {
return 0;
}
free(p);
//...
free(p);
解决方案是及时将NULL赋给p
free(p);
p = NULL;
free(p)
6 动态开辟内存忘记释放(内存泄漏)
例1
#include<stdio.h>
#include<Windows.h>
int main()
{
while(1){
malloc(1)
}
}
执行以上代码,内存会慢慢被耗干。
例二
void test(){
int* p = malloc(40);
if (NULL != p) {
*p = 20;
}
}
int main() {
test();
while (1);
}
在执行完test函数后,p作为临时变量,所以出了test函数就无法进行释放。