程序的堆区和栈区

关于进程的内存的分配参考博文:http://blog.csdn.net/hongchangfirst/article/details/6917829

这里主要说说堆区和栈区的区别:

1.堆区是程序里动态分配的内容,堆区的内存容量大,使用灵活,分别后要自行回收

   容易产生内存碎片。

2.栈区主要是存储函数的局部变量,然后程序结束后操作系统自行回收

   但是栈区容量比较小。

 

我们看下面这段测试代码:

 1 #include <iostream>
 2 using namespace std;
 3
 4
 5 int main()
 6 {
 7     int *DArea;
 8     int SArea[1024*252]={1,2,3,4,5};
 9     DArea=new int[5];
10     for(int i=1;i<=5;i++)
11     {
12         DArea[i-1]=i*10;
13     }
14
15     /************************************************************************/
16     /* DArea动态分配5个int大小的内存,分配在程序的堆区
17        SArea为局部变量,在栈区分配5个int大小的内存*/
18     /************************************************************************/
19     return 0;
20 }

我把断点打到return 0;这一句查看一下内存:

可以看出来前面四个地址均为0x0012ffxx,,而后面两个地址为:0x00252fxx

说明前面的四个元素是分配在一起的而后面两个元素是分配在一起的

那么我们可以猜测前面四个元素是存在于程序栈区,而后面两个元素是存在

于程序堆区。

&SArea[1]-&SArea[0]=sizeof(int),&DArea[1]-&DArea[0]=sizeof(int)

说明无论是分配在堆区的数据还是分配在栈区的元素都是连续存放的。

另外&SArea=&SArea[0]说明在栈区中数组名和数组第一个元素是等价的。

然而&DArea!=&DArea[0] 

我们再看看

DArea=&DArea[0],&DArea!=&DArea[0]说明动态分配的数组在栈中保存了一个指针,该指针指向堆区的第一个元素的地址。

正是这一点是与在栈中分配数据最大的区别

我们再梳理下:

对于在栈区中分配的数组,其数组名和数组中的一个元素占用同一块地址。

对于在堆区中分配的数据,其数据名是在栈中分配的一个指针变量,该变量

保存的一个堆区的一个元素地址,该元素正是动态分配在堆的第一个元素地址。

然而这里就揭示的内存泄露的原理,当我们再堆区中分配的内存如果没有手工

释放,程序结束后会把栈中的内存回收释放,该栈中保存了一个指向堆区元素

的指针。然而这个指针一旦释放了后,就再也没有元素指向堆区的那块元素,

然而堆区中的那块元素又没有释放,这自然而然的造成了内存泄露。

此外还有一点需要说明:

既然栈区大小有限,那到底是多大呢,VC里默认分配1M的栈空间。

当超过这个栈空间大小的时候会提示stack overflow。

那么我们来分配一个很大的数据(1024*1536>1M)来测试一下:

 1 #include <iostream>
 2 using namespace std;
 3
 4
 5 int main()
 6 {
 7     int *DArea;
 8     int SArea[1024*1536]={1,2,3,4,5};
 9     DArea=new int[5];
10     for(int i=1;i<=5;i++)
11     {
12         DArea[i-1]=i*10;
13     }
14     return 0;
15 }

提示:

那怎么改栈空间的大小呢,

在VC里面:

工程-设置-链接-输出-将堆栈输出中保留一项改为0x1000000(10M)我们再试试看:

这下没有提示栈溢出错误了。

好了,就到这里吧。

希望我的总结能对你有一点点帮助。

时间: 2024-08-28 03:18:47

程序的堆区和栈区的相关文章

堆区、栈区和静态存储区详解

一.内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量. 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 堆区:亦称动态内存分配.程序在运行的时候用malloc或new申请任意大小的内存,程

iOS内存的堆区和栈区

操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segment ”. Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release 栈由编译器管理自动释放的,在方法中(函数体)定义的变量通常是在栈内,因此如果你的变量要跨函数的话就需要将其定义为成员变量. 1.栈区(stack):由编译器自动分配释放,存放函数的参数值

堆区和栈区的区别

堆和栈的区别一.预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量

数据结构中的堆和栈 与 内存分配中的堆区和栈区 分析

比較全面的总结了诸多版本号,知识无国界.感谢各位的辛勤劳作. 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C/C++语言程序基本上都要用到.但对于非常多的初学着来说,堆栈是一个非常模糊的概念. (1) 数据结构的栈和堆 首先在数据结构上要知道堆栈,虽然我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈. 堆和栈都是一种数据项按序排列的数据结构. 栈就像装数据的桶或箱子 我们先从大家比較熟悉的栈说起吧.它是一种具有后进先出性质的数据结构,也就是说后存放的先取.先存放的后取.这就如同我们要取出

堆区和栈区的区别【转】

本文源自:http://blog.csdn.net/hairetz/article/details/4141043 一.预备知识—程序的内存分配     一个由C/C++编译的程序占用的内存分为以下几个部分     1.栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.     2.堆区(heap)   —   一般由程序员分配释放,   若程序员不释放,程序结束时可能由OS回收   .注意它与数据结构中的堆是两回事,分配方式

内存的堆区和栈区

1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数据结构中的堆和栈不是一回事. 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方式类似于数据结构中的栈,即后进先出.先进后出的原则. 例如:在函数中申明一个局部变量int b;系统自动在栈中为b开辟空间. 堆区(heap):一般由程序员申请并指明大小,最终也由程序员释放.如果程序员不释放,程序结束时可能会由OS回收.对于堆

栈区和堆区

注意,这里所说的堆区和栈区指的是(虚拟)内存区域,跟数据结构中的堆栈不一样. 栈区和堆区概念 栈区(stack)—— 由编译器自动分配释放,存放局部变量的值.函数调用所需要维护的信息等. 栈区必须满足这样一条规则:先入栈的数据后出栈(First In Last Out, FILO). 堆区(heap)——一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收.在C/C++中,堆区一般是通过malloc/new来申请的. 两者相同的一点就是它们都是分配在操作系统的虚拟内存中. 栈区和堆

C零基础视频-45-内存的分区:全局区、栈区、堆

目录 为什么程序的内存有分区 程序运行时的内存分区 堆内存 不久的将来,我们要开始学习在C中动态申请和释放内存.在学习它们之前,我们先学习程序内存的分区,为掌握和理解动态申请.释放内存做好基础铺垫. 为什么程序的内存有分区 一般而言,我们的住房会分成多个区域(卧室.厨房.阳台.卫生间等),不同区域有不同的功能. 运行时,程序分区的道理也是一样的,它方便操作系统管理程序,内存的不同区域,功能不同. 程序运行时的内存分区 作为初学者,我们简单认识下,程序有全局区.栈区和堆区即可. 全局区:在main

内存四区中堆区见解

堆区 由程序员分配释放 若程序员不释放,则在程序结束后自动释放. 堆区就像定义一样,由程序员自己分配,这里我们使用malloc函数来分配空间: #include <stdio.h> #include <string.h> #include <stdlib.h> char *getMem(int num) { char *p = NULL; p = (char *)malloc(sizeof(char) * num);//在堆区分配一块内存,并将指针指向这块区域 if(p