【转】关于堆栈和堆的概念(VC知识库)

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

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

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

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


void Myfunction()
{
   int i = 5;

   {
      int j = 6;
   }

   int k = i+j;
}

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

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

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

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

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


} //函数结束

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

posted on 2011-03-12 15:46  鲁大山  阅读(785)  评论(0编辑  收藏  举报

导航