掘金 人工智能 7小时前
C++——内存中的栈区和堆区
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入浅出地介绍了计算机内存中的栈区和堆区。栈区采用后进先出的方式由编译器自动管理,主要存储局部变量、函数参数和调用信息,分配速度快但容量有限。堆区则允许程序员通过new和delete手动分配和释放内存,容量更大,更灵活,但管理复杂。文章通过示例代码直观展示了栈区和堆区的变量地址,并详细对比了两者在分配释放、存储内容、大小限制、分配速度和管理方式上的差异。同时,文章也澄清了堆与指针的概念,强调堆内存的访问离不开指针。

📦 栈区(Stack)是一种后进先出(LIFO)的内存区域,其内存的分配与释放由编译器自动完成。它主要用于存储函数调用时的局部变量、函数参数以及函数调用的相关信息,分配速度快,但其大小通常受到编译器或操作系统的预设限制。

🏠 堆区(Heap)是另一块内存区域,允许程序员通过 `new` 和 `delete` 等关键字手动地申请和释放内存空间。堆区的大小相对较大,可以容纳动态分配的内存,但其管理复杂,需要程序员自行负责内存的分配和回收,否则可能导致内存泄漏。

⚡️ 栈区和堆区的核心区别在于内存管理方式和存储内容。栈区是自动管理的,存储局部变量和函数信息;堆区是手动管理的,存储动态分配的内存。栈区分配快且有固定规则,而堆区更灵活但管理成本高。

🔗 尽管堆区(Heap)和指针(Pointer)都与内存管理有关,但它们是不同的概念。堆是指内存中的一个区域,用于动态分配内存;而指针是存储内存地址的变量,是访问堆内存的关键工具。不能将堆等同于指针。

四、内存中的栈区和堆区 (Stack and Heap)

概念:

示例代码:

#include <iostream>int* createOnHeap() {  int* num = new int(100); // 在堆区分配内存  return num;}void functionOnStack() {  int localVar = 50; // 在栈区分配内存  std::cout << "栈区变量 localVar 的地址: " << &localVar << std::endl;}int main() {  // 栈区变量  int a = 10;  std::cout << "栈区变量 a 的地址: " << &a << std::endl;  // 堆区变量  int* b = new int;  *b = 20;  std::cout << "堆区变量 b 的地址: " << b << std::endl;  functionOnStack();  int* heapVar = createOnHeap();  std::cout << "堆区变量 heapVar 的地址: " << heapVar << std::endl;  std::cout << "堆区变量 heapVar 指向的值: " << *heapVar << std::endl;  delete heapVar;  heapVar = nullptr;  return 0;}

讲解要点:

特征栈区 (Stack)堆区 (Heap)
分配和释放编译器自动分配和释放程序员手动分配和释放 (new/delete)
存储内容局部变量、函数参数、函数调用信息动态分配的内存
大小限制有限,由编译器或操作系统预先设定相对较大,受系统可用内存限制
分配速度相对较慢
管理方式自动管理手动管理

延申问题:堆是指针吗堆(Heap)不是指针,但堆内存的访问必须通过指针来实现。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

内存管理 栈区 堆区 指针 C++
相关文章