菜单
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

C 释放内存


释放(free)内存

当您不再需要一块内存时,应该释放它。释放内存也称为“free”内存。

动态分配的内存会一直保留,直到被释放或者程序结束。

一旦内存被释放,它可以被其他程序使用,或者甚至可以被分配给您程序的另一部分。


释放内存

要释放内存,请使用 free() 函数

free(pointer);

pointer 参数是指向要释放的内存地址的指针

int *ptr;
ptr = malloc(sizeof(*ptr));

free(ptr);
ptr = NULL;

将指针设置为 NULL 是一个好习惯,这样可以防止您意外地继续使用它。

如果您在释放内存后继续使用该内存,可能会损坏其他程序的数据,甚至是您自己程序中的另一部分数据。

示例

包含错误检查和释放的实际示例

int *ptr;
ptr = malloc(sizeof(*ptr)); // 为一个整数分配内存

// 如果内存分配失败,则打印一条消息并结束 main() 函数
if (ptr == NULL) {
  printf("无法分配内存");
  return 1;
}

// 设置整数的值
*ptr = 20;

// 打印整数值
printf("整数值: %d\n", *ptr);

// 释放已分配的内存
free(ptr);

// 将指针设置为 NULL,以防止其被意外使用
ptr = NULL;
自己动手试一试 »


内存泄漏

内存泄漏发生在动态内存被分配但从未被释放时。

如果在循环或频繁调用的函数中发生内存泄漏,可能会占用过多内存并导致计算机变慢。

在内存被释放之前,指向动态内存的指针丢失,就有可能发生内存泄漏。这可能是意外发生的,因此要注意并跟踪动态内存的指针非常重要。

以下是指向动态内存的指针可能丢失的一些示例。

示例 1

指针被覆盖

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("函数已结束");
  return 0;
}

在此示例中,函数内部分配的内存会在函数结束后仍然分配,但无法再访问。防止此问题的一种方法是在函数结束前释放内存。

 示例 3

由于重新分配失败导致指针丢失

int* ptr;
ptr = malloc(sizeof(*ptr));
ptr = realloc(ptr, 2*sizeof(*ptr));

如果 realloc() 无法重新分配内存,它将返回一个指向 NULL 的指针,而原始内存将保持保留状态。

在此示例中,如果 realloc() 失败,则 NULL 指针被赋给 ptr 变量,覆盖了原始内存地址,使其无法再访问。


总结

总而言之,在 C 语言中管理内存时,请遵循最佳实践

  1. 记住检查错误(NULL 返回值),以确定内存分配是否成功
  2. 防止内存泄漏 - 始终记住释放不再使用的内存,否则程序可能会性能下降,甚至更糟的是,如果内存耗尽,程序可能会崩溃
  3. 将指针设置为 NULL 后再释放内存,以防止您意外地继续使用它



×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持