C/C++内存分区
随手搜的一个问题,本来只是想印证一下自己的想法,怎料这个问题居然还有这么多不同的说法。根据网上的资料和我自己的观点,总结如下:
在C/C++中内存分为五个区:栈区、堆区、(自由存储区、)全局/静态存储区和常量存储区
-
栈区
- 通常是局部变量和函数参数,由编译器自动分配释放
-
堆区
- 本来在我的理解中,动态分配的内存都应该在堆区,即new和malloc的内存都在此,现在才发现是把C和C++的记混了
- C++中使用malloc分配的内存,在堆区,而由new分配的内存,则在自由存储区
- 关于自由存储区和堆区的概念相关,见C++ 自由存储区是否等价于堆?, 感谢小伙伴suilin的提醒。
-
自由存储区
- C++中,由new分配的内存,在这个区。
- 而在C语言中是没有这个区的,由malloc分配的内存,在堆区
-
全局/静态存储区
- 全局变量和静态变量。
- 在C语言中,全局变量又分为初始化的和未初始化的,其中初始化的全局变量和静态变量在这一分区,未初始化的全局变化和静态变量在与之相邻的另一区域中(BSS段)
- 在C++中,没有区分变量的初始化和未初始化,所以,都在这一内存区
-
常量存储区
- 存放常量的区域,不允许修改