1.对空指针的解引用操作
void test()
{
int* p = (int*)malloc(40);
*p = 20;//如果p的值为NULL,就会出现错误
free(p);
}
在进行动态内存开辟之后,一定要判断是否开辟成功,因为开辟失败后,返回值为NULL
2.对动态开辟空间的越界访问
void test()
{
int* p = (int*)malloc(5 * sizeof(int));
if (p == NULL)
printf("");
else
{
int i = 0;
for (i = 0; i < 10; i++)
*(p + i) = i;//产生越界访问,程序崩溃
}
free(p);
p = NULL;
}
3.对非动态开辟内存使用free释放
void test()
{
int a = 10;
int* p = &a;
*p = 20;//p此时存在栈区
free(p);//free函数释放堆区的内存
p = NULL;
return 0;
}
4.使用free释放动态开辟内存的一部分
void test()
{
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 = NULL;
return 0;
}
5.对同一块动态开辟内存进行多次释放
void test()
{
int* p = (int*)malloc(40);
if (p == NULL)
return 0;
free(p);
//....
//....
free(p);
return 0;
}
6.动态开辟内存忘记释放(内存泄漏)
注:使用完后一定要进行内存释放