1不判断,直接解引用赋值
int main()
{
int* p = (int*)malloc(40);
*p = 20;
free(p);
p = NULL;
return 0;
}
正常应该这样
int main()
//{
// int* p = (int*)malloc(40);
// if (p == NULL)
// {
// return 1;
// }
// *p = 20;
// free(p);
// p = NULL;
//
// return 0;
//}
2对动态开辟空间的越界访问
int main()
//{
// int* p = (int*)malloc(40);
// if (p == NULL)
// {
// printf("%s\n", strerror(errno));
// return 1;
// }
// //方式
// int i = 0;
// for (i = 0; i <= 10; i++)
// {
// p[i] = i;
// }
//
// free(p);
// p = NULL;
// return 0;
//}
注意for循环里i取到了10.但malloc只开辟了10个整形空间。
3.对非动态开辟内存使用free释放
int main()
//{
// int a = 10;
// int* p = &a;
// //.....
//
// free(p);
// p = NULL;
//
// return 0;
//}
free只能对malloc,calloc,realloc等动态开辟的空间进行释放。
4. 使用free释放一块动态开辟内存的一部分
int main()
//{
// int* p = (int*)malloc(40);
// if (p == NULL)
// {
// return 1;
// }
// //使用
// int i = 0;
// for (i = 0; i < 5; i++)
// {
// *p = i;
// p++;
// }
//
// //释放
// free(p);
// p = NULL;
//
// return 0;
//}
free不能只释放一部分动态开辟的空间
正确应该定义p指针时前面加const,p不能修改,赋为NULL也不行 。
5. 对同一块动态内存多次释放
int main()
{
int* p = (int*)malloc(40);
//....
free(p);
p = NULL;
//...
free(p);
return 0;
}
释放完后要赋为NULL。
6.动态开辟内存忘记释放(内存泄漏)
void test()
//{
// int* p = (int*)malloc(100);
// //....
// int flag = 0;
// scanf("%d", &flag);//5
// if (flag == 5)
// return;
//}
//
//int main()
//{
// test();
// //......
//
//
// return 0;
//}