目录
使用free释放一块动态开辟内存的一部分
对同一块动态内存多次释放
动态开辟内存忘记释放(内存泄漏)
使用free释放一块动态开辟内存的一部分
代码演示:
// 动态开辟10个整型空间
int* p = (int*)malloc(sizeof(int) * 10);
// 判断是否开辟成功
if (p == NULL)
{
perror("malloc");
return -1;
}
for (int i = 0; i < 5; i++)
{
*p = i;
p++;
}
// 释放
free(p);
p = NULL;
代码解析:
p++ ,使得 p 所指向的位置一直在发生改变,而 free 是从 p 所指向的位置往后释放,这样就会导致只释放了动态开辟内存的一部分
代码验证:
代码改正:
// 动态开辟10个整型空间
int* p = (int*)malloc(sizeof(int) * 10);
// 判断是否开辟成功
if (p == NULL)
{
perror("malloc");
return -1;
}
for (int i = 0; i < 5; i++)
{
*(p + i) = i;
}
// 释放
free(p);
p = NULL;
对同一块动态内存多次释放
代码演示:
// 动态开辟10个整型空间
int* p = (int*)malloc(sizeof(int) * 10);
// 判断是否开辟成功
if (p == NULL)
{
perror("malloc");
return -1;
}
free(p);
free(p); //重复释放
代码验证:
所以将 p 指针所指向的动态空间释放后要及时置空,因为 free 函数对置空的指针不做处理
动态开辟内存忘记释放(内存泄漏)
代码演示:
void test()
{
int* p = (int*)malloc(sizeof(int) * 10);
if (p != NULL)
{
*p = 10;
}
}
int main()
{
test();
while (1);
return 0;
}
代码解析:
调用 test 函数后并没有释放 p 指针所指向的动态开辟空间,当 test 函数调完后销毁了 p 指针,但是动态开辟的内存没有 free 释放,且回主函数后是 while(1) 死循环,程序一直就不会结束,这样就会导致内存泄漏