gpt4 book ai didi

C 内存管理

转载 作者:IT王子 更新时间:2023-10-28 23:28:19 26 4
gpt4 key购买 nike

我一直听说,在 C 语言中,您必须真正注意如何管理内存。而且我还在开始学习 C,但到目前为止,我根本不需要做任何与内存管理相关的事件。我一直想象着必须释放变量并做各种丑陋的事情。但这似乎并非如此。

有人可以向我展示(带有代码示例)你何时必须进行一些“内存管理”的示例吗?

最佳答案

有两个地方可以将变量放入内存中。当您创建这样的变量时:

int  a;
char c;
char d[16];

变量在“stack”中创建。当堆栈变量超出范围时(即代码无法再访问它们时),它们会自动释放。您可能会听到将它们称为“自动”变量,但这种说法已经过时了。

许多初学者示例将只使用堆栈变量。

堆栈很好,因为它是自动的,但它也有两个缺点:(1) 编译器需要提前知道变量有多大,以及 (2) 堆栈空间有限。例如:在 Windows 中,在 Microsoft 链接器的默认设置下,堆栈设置为 1 MB,并且并非所有堆栈都可用于您的变量。

如果您在编译时不知道您的数组有多大,或者如果您需要一个大数组或结构,则需要“plan B”。

B 计划称为“”。您通常可以创建与操作系统允许的一样大的变量,但您必须自己做。较早的帖子向您展示了一种方法,尽管还有其他方法:

int size;
// ...
// Set size to some value, based on information available at run-time. Then:
// ...
char *p = (char *)malloc(size);

(注意堆中的变量不是直接操作的,而是通过指针操作的)

一旦你创建了一个堆变量,问题是编译器不能告诉你什么时候完成了它,所以你失去了自动释放。这就是您所指的“手动释放”的用武之地。您的代码现在负责决定何时不再需要该变量,并释放它以便可以将内存用于其他目的。对于上述情况,使用:

free(p);

使第二个选项“令人讨厌”的原因在于,何时不再需要该变量并不总是那么容易知道。在不需要时忘记释放变量会导致程序消耗更多所需的内存。这种情况称为“泄漏”。在您的程序结束并且操作系统恢复其所有资源之前,“泄漏”的内存不能用于任何事情。如果您错误地释放了一个堆变量您真正完成它之前,甚至可能出现更严重的问题。

在 C 和 C++ 中,您负责清理堆变量,如上所示。但是,有些语言和环境(如 Java 和 C# 等 .NET 语言)使用不同的方法,堆会自行清理。第二种方法称为“垃圾收集”,对开发人员来说要容易得多,但会在开销和性能方面付出代价。这是一种平衡。

(我已经掩盖了许多细节,以便给出一个更简单但希望更公平的答案)

关于C 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com