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 = newint[10000]; // 这一行代码将在堆中创建10000个元素的数组,由iArray指向其地址
for (int k =0; k<10000;k++)
{
iArray[k]= k + i;
cout<< iArray[k]<< "n";
}
deleteiArray; // 从堆中删除或释放数组占用的地址空间,否则将会有内存泄漏
} //函数结束
注意:iArray 不是一个堆变量。它是一个局部指针变量,指向堆中未命名的一个数