1.没有判断malloc返回值是否开辟成功,对NULL解引用操作
int main()
{
int* p = (int*)malloc(40);//没有判断malloc开辟失败情况
//万一malloc失败,p就被赋值为NULL
for (int i = 0; i < 10; i++)
{
*(p + i) = i;
}
free(p);
p = NULL;
return 0;
}
2.对动态开辟内存的越界访问
int main()
{
int* p =(int *) malloc(5*sizeof(int));//20个字节
if (p == NULL)
{
return 0;
}
else
{
int i = 0;
for (i = 0; i < 10; i++)//此时访问的字节已经越过malloc开辟的空间大小
{
*(p + i) = i;
}
}
free(p);
p = NULL;
return 0;
}
3.对非动态(堆区之外的)开辟的内存使用free
int main()
{
int a = 10;//栈区开辟的空间
int* p = &a;
*p = 20;
free(p);
p = NULL;
return 0;
}
4.使用free释放动态开辟内存的一部分
int main()
{
int* p = (int*)malloc(40);
if (p == NULL);
{
return 0;
}
int i = 0;
for (i = 0; i < 10; i++)
{
*p++ = i;
}
free(p);//期间p已经发生变化,必须是在p先开始的起始位置进行释放
p = NULL;
return 0;
}
5.对同一块内存进行多次释放
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
{
return 0;
}
free(p);
//可以p=NULL;避免多次释放
free(p);
return 0;
}
6.对动态开辟内存的忘记释放--导致内存泄露
int main()
{
while (1)
{
malloc(1);//一直开辟不回收
}
return 0;
}
标签:malloc,main,return,错误,int,free,动态内存,NULL,开辟
From: https://blog.51cto.com/u_16425777/9135047