❮ C 重新分配内存
C 结构体和动态内存 ❯
C 释放内存
更新于 2025/12/5 14:52:17
释放(free)内存
当您不再需要一块内存时,应该将其释放。释放也称为"释放"内存。
动态内存会一直保留,直到被释放或程序结束。
内存释放后,其他程序可以使用它,甚至可以将其分配给程序的其他部分。
释放内存
要释放内存,请使用 free() 函数:
free(pointer);
指针参数是指向要释放的内存地址的指针:
int *ptr;ptr = malloc(sizeof(*ptr));free(ptr);ptr = NULL;
释放内存后,将指针设置为NULL被认为是一种良好的编程实践,这样可以避免意外地继续使用该内存。
如果在内存释放后继续使用,可能会损坏其他程序的数据,甚至损坏您自己程序的其他部分。
示例
包含错误检查和释放操作的示例:
int *ptr;ptr = malloc(sizeof(*ptr)); // 为一个整数分配内存
// 如果无法分配内存,则打印一条消息并结束 main() 函数。
if (ptr == NULL) {
printf("Unable to allocate memory");
return 1; // 程序退出并返回错误代码
}// 设置整数的值
*ptr = 20;
// 打印整数值
printf("Integer value: %d", *ptr);
// 已分配的空闲内存
free(ptr);
// 将指针设置为 NULL 以防止意外使用
ptr = NULL;
亲自试一试 »
内存泄漏
内存泄漏是指动态内存被分配后却从未被释放。
如果内存泄漏发生在循环或频繁调用的函数中,则可能占用过多内存,导致计算机运行速度变慢。
如果在动态内存被释放之前丢失了指向动态内存的指针,则存在内存泄漏的风险。这种情况可能会意外发生,因此务必小心谨慎,并妥善管理指向动态内存的指针。
以下是一些动态内存指针可能丢失的示例。
Example 1
The pointer is overwritten:
int x = 5;int *ptr;ptr = calloc(2, sizeof(*ptr));ptr = &x;
在这个例子中,指针指向x之后,通过calloc()分配的内存就无法再被访问了。
示例 2
指针仅存在于函数内部:
void myFunction() {
int *ptr;
ptr = malloc(sizeof(*ptr));
}
int main() {
myFunction();
printf("The function has ended");
return 0;}
在这个例子中,函数内部分配的内存会在函数结束后仍然保持分配状态,但无法再被访问。避免这个问题的方法之一是在函数结束前释放内存。
示例 3
当重新分配失败时,指针会丢失:
int* ptr;ptr = malloc(sizeof(*ptr));ptr = realloc(ptr,
2*sizeof(*ptr));
如果 realloc() 无法重新分配内存,它将返回指向 NULL 的指针,并且原始内存将保持保留状态。
在这个例子中,如果 realloc() 失败,则将 NULL 指针赋值给 ptr 变量,覆盖原始内存地址,使其无法再被访问。
总结
总而言之,在 C 语言中管理内存时,请遵循最佳实践:
请记住检查错误(NULL 返回值)以确定内存分配是否成功
防止内存泄漏 - 务必记得释放不再使用的内存,否则程序可能会运行缓慢,甚至更糟,如果内存耗尽,程序可能会崩溃。
释放内存后,将指针设置为 NULL,以防止意外地继续使用它。
提示:您将在NULL章节中了解更多关于NULL的内容。
❮ C 重新分配内存
C 结构体和动态内存 ❯