分享

C++中堆和栈以及相关

 Tech-d 2013-03-14
五个不同的内存区:
1. 堆(heap):由new分配的,需要手动释放或者在程序结束时由OS释放,不由编译器管的内存,注意它与数据结构中的堆不是一个意思。分配方式类似于数据结构中的链表

2. 栈(stack):由编译器负责处理分配和释放的内存,通常指局部变量,函数参数等。其操作方式类似于数据结构中的栈。

3. 自由储存区,跟堆差不多,但是由malloc/free 来分配/释放。

4. 全局/静态储存区(static):全局和静态变量占用的区域,程序结束后由OS释放;全局变量的初始化要在进入main函数之前被执行

5. 常量储存区(constant):保存常量,数值不可修改

========================================================================
void f()
{
int *op = new int[5]; //指针op指向一块大小为sizeof(int) * 5的堆(heap),
//但这个指针op本身是保存在一块栈(stack)中的。
}

在栈内存中存放了一块指向堆内存的指针。程序会先确定需要在堆中用到的内存的大小,然后调用operator new来分配一个内存,然后返回这个内存的首地址,放入栈中。
使用完之后,用delete []op 来告诉程序删除这个数组。


=========================================================================
堆比栈好的地方就在与灵活,可以人为控制创建和释放;而栈则由机器控制,你不知道什么时候创建和释放了。对于大的对象、数组尽量用堆,不要用栈。

栈:动态分配和静态分配两种,动态分配就是用到了malloc。栈的生长方向是向着内存地址减小的方向走的。栈的调用效率也比较高。只是分配内存的大小没有堆灵活,所以需要分配大量的内存空间时,还是倾向于用堆。

堆:只有动态分配(new/delete)。堆的生长方向是向着内存地址增大的方向走的。频繁调用new/delete会产生大量的内存碎片,调用效率也低于栈,优势是你可以控制申请的内存空间的大小,所以在需要分配大量内存空间,如大的数组时,倾向于选择堆:

这是一个前辈写的,非常详细 
//main.cpp 
int a = 0; //全局初始化区 
char *p1; //全局未初始化区 
int main() 

int b;                               //栈 
char s[] = "abc";              //栈 
char *p2;                         //栈 
char *p3 = "123456";        //123456\0在常量区,p3在栈上。 
static int c =0;              //全局(静态)初始化区 
p1 = new char[10]; 
p2 = new char[20];          //分配得来得10和20字节的区域就在堆区。 
strcpy(p1, "123456");      //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多