Menu
×
   ❮   
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(指针);

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

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,这样您就不会意外地继续使用它



×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.