理解堆栈和堆内存

如果您是程序员或对计算机有浓厚兴趣的人,您一定会遇到堆栈和堆内存。许多人错误地交替使用这些术语。了解内存分配是什么样的以及堆栈和堆分配有何不同至关重要。

您可能熟悉堆和堆栈作为数据结构的概念。但是你应该记住堆和栈内存分配是一个不同的概念。在调试复杂的编码问题或面临艰难的工作面试时,了解这些基本原则可以发挥重要作用。当我们深入了解堆栈和堆内存分配时,请继续阅读。

堆栈内存分配

堆栈内存分配是一种发生在函数调用堆栈中的临时分配方法。编译器管理为程序员函数创建的临时变量分配的内存。一旦它完全执行了函数内的代码,编译器将自动释放这个临时内存。

程序可以非常快速地访问堆栈上的变量,因为它们直接存储在主内存中。一个函数或方法也可以调用另一个函数/方法。因此,编译器必须有效地管理每个函数调用的不同变量。

程序在第一次调用函数时分配堆栈内存。如果程序员在特定函数中声明了一个变量或数组,编译器将在函数调用堆栈上保留额外的内存。

相关:堆与堆栈:是什么让它们与众不同?

重要的是要记住,编译器会自动进行堆栈的分配和释放。因此,程序员无需担心。但是,尽可能少地消耗堆栈内存是一种很好的编程习惯。这意味着以不需要任何临时方法变量的方式智能地编写代码。

程序员经常犯使用指针访问堆栈内存中的数据的错误。但是一旦函数返回,函数调用堆栈就会被释放。有时,尽管堆栈已完全释放,指针仍会返回正确的数据。但大多数时候,无效的内存指针会返回一个垃圾值。始终建议避免这种不可靠的指针使用。

堆内存分配

在堆中分配的内存通常称为动态内存分配。与堆栈内存相比,在堆中分配和释放内存是程序员的工作。您可以将堆内存视为程序员可用的一块内存。

堆内存大小取决于程序可用的虚拟内存大小。与存储在函数调用堆栈中的数据相比,堆内存的访问速度较慢。程序员可以显式分配和释放堆中的块。这允许他们保存函数或变量的返回值,而不会遇到垃圾值和覆盖内存段。

在某些编程语言(例如 C++)中,程序员使用new关键字分配所需的内存大小并使用delete来释放分配。将指针重置为 null 以避免未定义的行为也被认为是一种很好的做法。

另请参阅: C++ 在 2021 年是否仍然相关?

因为程序员明确管理堆内存,他们负责在终止程序之前释放它。未能正确管理显式声明的内存可能会导致内存泄漏和悬空指针。这可能会导致您的代码出现意外的未定义故障。

一个好的程序员知道他们的记忆

内存分配是程序工作的重要组成部分。一个好的程序员必须能有效地利用系统资源。了解堆栈和堆内存分配的复杂细节将使您成为一名更好的程序员。