内存分区

C++的内存划分为栈区、堆区、全局区/静态区、字符串常量和代码区。

1. 栈区:

由系统进行内存的管理。
说明:主要存放函数的参数以及局部变量。栈区由系统进行内存管理,在函数完成执行,系统自行释放栈区内存,不需要用户管理。整个程序的栈区的大小可以在编译器中由用户自行设定,默认的栈区大小为3M。

2. 全局/静态区:

全局、静态数据存放在一起的,初始化的全局变量和静态变量是在一起的。未初始化的全局变量和静态变量是在相邻的空间中。
说明:全局变量和静态全局变量的存储方式一致,但是其区别在于作用域不同,全局变量在整个源代码中都可以使用,而静态全局变量只能在当前文件中有效。比如我们的一个程序有5个文件,那么某个文件中申请了静态全局变量,这个静态全局变量只能在当前文件中使用,其他四个文件均不可以使用。而某个文件中申请了全局变量,那么其他四个文件中都可以使用该全局变量(只需要通过关键字extern申明一下就可以使用了)。事实上static改变了变量的作用范围。

3. 字符串常量区:

存放字符串常量,程序结束后,由系统进行释放。比如我们定义char * p = “Hello World”; 这里的“Hello World”就是在字符串常量中,最终系统会自动释放。

4. 代码区:

存放程序体的二进制代码。比如我们写的函数,都是在代码区的。

5. 堆区:

由用户手动申请,手动释放。在C中使用malloc,在C++中使用new(当然C++中也可以使用malloc)。
说明:new操作符本质上还是使用了malloc进行内存的申请,因此我将自由存储区和堆区都说成堆区,不过两者还是有很大的差别。
1)malloc是C语言中的函数,而new是C++中的操作符。
2)malloc申请之后返回的类型是void*,而new返回的指针带有类型。
3)malloc只负责内存的分配而不会调用类的构造函数,而new不仅会分配内存,而且会自动调用类的构造函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • http://blog.csdn.net/k346k346/article/details/45592329 导读...
    闻道刘阅读 496评论 0 2
  • 堆区,栈区,文字常量区,全局区,代码区 栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部...
    蜗牛上上升阅读 785评论 0 1
  • 感谢前辈 Dablelv 的分享原文 - https://blog.csdn.net/k346k346/artic...
    lc_fan阅读 889评论 0 2
  • 几种语言的特性 汇编程序:将汇编语言源程序翻译成目标程序编译程序:将高级语言源程序翻译成目标程序解释程序:将高级语...
    囊萤映雪的萤阅读 2,966评论 1 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,156评论 1 32