C++中堆和栈(非数据结构的heap and stack)的完全解析
来源:互联网 发布:轩辕剑纹身进阶数据 编辑:程序博客网 时间:2024/06/04 19:15
内存分配方面:
堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码 中的delete语句才能正确的释放本内存空间。我们常说的内存泄露,最常见的就是堆泄露(还有资源泄露),它是指程序在运行中出现泄露,如果程序被关闭掉的话,操作系统会帮助释放泄露的内存。
栈:在函数调用时第一个进栈的主函数中的下一条指令(函数调用语句的下一条可执行语句)的地址然后是函数 的各个参数,在大多数的C编译器中,参数是由右往左入栈,然后是函数中的局部变量。
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
有些说法,把3,4合在一起,也有的把3分成自由存储区(malloc/free)和全局/静态存储区。
这与编译器和操作系统有关。
二、例子程序
原文地址:http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html
堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码 中的delete语句才能正确的释放本内存空间。我们常说的内存泄露,最常见的就是堆泄露(还有资源泄露),它是指程序在运行中出现泄露,如果程序被关闭掉的话,操作系统会帮助释放泄露的内存。
栈:在函数调用时第一个进栈的主函数中的下一条指令(函数调用语句的下一条可执行语句)的地址然后是函数 的各个参数,在大多数的C编译器中,参数是由右往左入栈,然后是函数中的局部变量。
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
有些说法,把3,4合在一起,也有的把3分成自由存储区(malloc/free)和全局/静态存储区。
这与编译器和操作系统有关。
二、例子程序
这是一个前辈写的,非常详细
//main.cppint a = 0; 全局初始化区char *p1; 全局未初始化区main(){int b; 栈char s[] = "abc"; 栈 //更正:abc 分配在静态存储区,不是栈上char *p2; 栈char *p3 = "123456"; 123456\0在常量区,p3在栈上。static int c =0; 全局(静态)初始化区p1 = (char *)malloc(10);p2 = (char *)malloc(20);分配得来得10和20字节的区域就在堆区。strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。}
原文地址:http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html
0 0
- C++中堆和栈(非数据结构的heap and stack)的完全解析
- 内存中堆(heap)和栈(stack)的区别(非数据结构中的堆和栈)
- 堆和栈的区别(stack and heap)
- c语言stack(栈)和heap(堆)的使用详解
- 【Objective-C】栈(stack)和堆(heap)的区别
- java中栈(stack)和堆(heap)的区别
- java中栈(stack)和堆(heap)的区别
- Java中Stack栈和Heap堆的区别
- 关于DSP中堆heap和栈stack的理解
- java中堆(stack)和栈(heap)的区别
- java中堆(stack)和栈(heap)的区别
- 栈(Stack)和堆(Heap)的比较
- 堆(heap)和栈(stack)的区别
- 堆(heap)和栈(stack)的区别
- 堆(heap)和栈(stack)的区别
- Stack栈和Heap堆的区别
- Heap(堆)和Stack(栈)的区别
- 堆(heap)和栈(stack)的区别
- Code Review中的几个提示
- jQuery 知识点(六) —— jQuery 工具函数和全局属性
- Nested List Weight Sum II
- Unity预编译宏定义
- 【JavaWeb-3】XML的解析与XPath的使用
- C++中堆和栈(非数据结构的heap and stack)的完全解析
- 用qemu调试linux内核
- 寻找http://localhost/phpmyadmin出现的问题:HTTP 错误 404.0 - Not Found 您要找的资源已被删除、已更名或暂时不可用
- BZOJ 1602 [Usaco2008 Oct]牧场行走
- C语言学习笔记 lesson3 整数类型
- Php服务器部署问题之http错误404.3-Not Found
- Brothers 纪中4764 模拟
- Crisis 纪中 4765 树形dp
- priority_queue详解