堆与堆栈的区别C++ 堆栈区别

[问题]
C++中创建本地(或者说局域)变量是在堆栈(stack)中分配内存地址,而创建全局变量则是在堆(heap)中分配内存地址。
我想知道什么是堆(heap)?为什么全局变量和本地变量在分配内存地址时要分别对待,堆和堆栈那一个更有效率?

[回答]
在Window中执行的每一个应用程序都有其自己的内存地址。一部分内存空间用于存放程序代码,一部分内存空间用于存放程序执行期间
创建的变量。创将变量的方法有两种,一种是在堆中,另外一种则在堆栈里。

理解堆的最好的方法是将它看成一个程序随时可以使用的内存块。为了创建堆变量,程序要使用“new”(在C++里)操作符或者
“malloc”(在C中)例程,它们返回指向变量的指针(堆变量总是通过指针来处理和操作)。最后程序用“delete”(在C++里)操作符
或者“free”(在C中)例程来删除或者释放内存空间。

而堆栈则不同,它是某个函数被调用后随时可以创建的一小块内存,被用于在函数范围内保存变量(也称为自动变量)。在函数中,任何
包含在{}内的代码都有其自己的堆栈。当这个函数或者{}退出时,堆栈以及它包含的所有内容都被摧毁。因此下面的代码是不运行的:


void Myfunction()
堆与堆栈的区别C++ 堆栈区别
{
int i =5;

{
int j = 6;
}

int k =i+j;
}

所以本文问题的答案是:使用堆栈(stack)分配本地或者局域变量的地址空间,而用堆(heap)分配大块内存地址或者动态创建对象的情形。
例如:

void MyFunction()
{
int i = 5; //堆栈中的本地(自动)变量
int *iArray;// 堆栈中的本地(自动)变量

iArray = newint[10000]; // 这一行代码将在堆中创建10000个元素的数组,由iArray指向其地址

for (int k =0; k<10000;k++)
{
iArray[k]= k + i;
cout<< iArray[k]<< "n";
}

deleteiArray; // 从堆中删除或释放数组占用的地址空间,否则将会有内存泄漏


} //函数结束

注意:iArray 不是一个堆变量。它是一个局部指针变量,指向堆中未命名的一个数

  

爱华网本文地址 » http://www.413yy.cn/a/25101014/192638.html

更多阅读

大理石与花岗岩的区别 大理石有辐射吗

大理石与花岗岩的区别 ? ?一、按石材成因划分:1.大理石大理石属于变质岩变质岩是在高温高压和矿物质的混合作用下由一种石头自然变质成的另一种石头。质变可能是重结晶、纹理改变或颜色改变。天然大理石是地壳中原有

电脑待机与休眠的区别 电脑待机和休眠的区别

电脑待机与休眠的区别? ? 首先确定的是休眠和待机不能下载的。因为硬盘都断电了。?休眠和待机的原理都是吧内存的东西保存住,下次就可以不用重新加载操作系统,但他们最大的不同是前者把内存中的数据临时保存到硬盘中,下次开机就直接

黄金期货交易规则与股票的区别 商品期货交易规则

黄金期货交易规则与股票的区别——简介国内第一个贵金属期货品种黄金期货2008年1月9日正式在上海期货交易所挂牌交易。上海期货交易所昨日发布公告,将各个期限黄金期货合约挂牌当日的基准价规定在209.99元/克的水平上。黄金期货交易

港货与行货的区别 港版和国行怎么分辨

港货与行货的区别——简介港货和行货通常代表从不同销售渠道进入大陆的电子产品,下面简单和大家分享港货和行货的区别。港货与行货的区别——工具/原料聪明的你港货与行货的区别——方法/步骤港货与行货的区别 1、

函数COUNT与COUNTA的区别 excel count和counta

函数COUNT与COUNTA的区别——简介COUNT与COUNTA经常用在Excel统计参数列表中指定项个数的情景中。而两者也是存在这差别的,如果不注意的话,这两个函数就容易搞混;这两个函数应该说很简单,也比较容易掌握,但大多数人可能只知COUNT不知COUN

声明:《堆与堆栈的区别C++ 堆栈区别》为网友夕阳追脚尖分享!如侵犯到您的合法权益请联系我们删除