五个不同的内存区: 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),
} 在栈内存中存放了一块指向堆内存的指针。程序会先确定需要在堆中用到的内存的大小,然后调用operator new来分配一个内存,然后返回这个内存的首地址,放入栈中。 使用完之后,用delete []op 来告诉程序删除这个数组。 ========================================================================= 堆比栈好的地方就在与灵活,可以人为控制创建和释放;而栈则由机器控制,你不知道什么时候创建和释放了。对于大的对象、数组尽量用堆,不要用栈。 栈:动态分配和静态分配两种,动态分配就是用到了malloc。栈的生长方向是向着内存地址减小的方向走的。栈的调用效率也比较高。只是分配内存的大小没有堆灵活,所以需要分配大量的内存空间时,还是倾向于用堆。 堆:只有动态分配(new/delete)。堆的生长方向是向着内存地址增大的方向走的。频繁调用new/delete会产生大量的内存碎片,调用效率也低于栈,优势是你可以控制申请的内存空间的大小,所以在需要分配大量内存空间,如大的数组时,倾向于选择堆: 这是一个前辈写的,非常详细 //main.cpp int a = 0; //全局初始化区 char *p1; //全局未初始化区 int main() {
}
|
|