1.1 对NULL指针的解引用 操作
void test()
{
int *p=(int*)malloc(INT_MAX/4);
*p=20; //没有对p指针进行判读是否为空指针,存在安全隐患
free(p);
}
void test()
{
int *p=(int*)malloc(INT_MAX/4);
if(p == NULL)
{
printf("空间创建失败\n"); //对p指针进行判断,防止空指针
return 1;
}
*p=20;
free(p);
p=NULL;
}
1.2 对动态开辟的空间越界访问
int main()
{
int* p = (int*)malloc(40);
if (p = NULL)
{
printf("%s\n",strerror(errno));
return 1;
}
for (int i = 0; i <= 10; i++)
{
p[i] = i; //越界访问多一个元素
}
free(p);
p = NULL;
return 0;
}
int main()
{
int* p = (int*)malloc(40);
if (p = NULL)
{
printf("%s\n",strerror(errno));
return 1;
}
for (int i = 0; i < 10; i++) //在开辟对应的空间范围内使用元素
{
p[i] = i;
}
free(p);
p = NULL;
return 0;
}
1.3 对非动态开辟的内存进行释放
int main()
{
int a = 10;
int* p = &a;
//.........
free(p); //对非动态开辟的内存进行释放,a的内存在栈区
p = NULL;
return 0;
}
1.4 使用free释放一块动态开辟内存的一部分内存
void teset
{
int* p=(int*)malloc(40);
p++; //改变了p的地址
free(p); //释放的不是p的起始地址
}
1.5 对同一块内存空间多次释放
int main()
{
int* p = (int*)malloc(40);
free(p);
//.....
free(p); //多次释放内存空间
return 0;
}
int main()
{
int* p = (int*)malloc(40);
free(p);
p=NULL; //释放完动态开辟的内存后,把p指针变为空指针
//.....
free(p); //p为空指针,free就什么都不会释放
return 0;
}
1.6 动态开辟内存忘记释放(内存泄漏)
void test()
{
int* p = (int*)malloc(40);
int i = 0;
scanf("%d",&i);
if (i == 6) //当i为6时,就跳出这个函数,开辟的动态内存就没办法释放,导致内存泄漏。
{
return;
}
free(p);
p = NULL;
}
int main()
{
test();
return 0;
}
忘记释放不再使用的动态内存空间会造成内存泄漏。
动态内存的空间一定要释放,并且正确的释放。