zoukankan      html  css  js  c++  java
  • 正确的C++内存分区

    前导:作为一个C++的菜鸟,一直对C++的内存分区比较晕乎,网络上的分配方式各式各样,让人看得云里雾里。网络上有一种分区,将C++内存分为:堆区、栈区、自由存储区、全局/静态存储区和常量存储区个人认为这是完全错误的内存划分方式,误导我这样的菜鸟。鉴于此,我查找资料,整理出以下的结论。

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

    这里去掉自由存储区,增加了代码区,理由会在下面讲到。

    栈区:由系统进行内存的管理。

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

    全局/静态区:全局、静态数据存放在一起的,初始化的全局变量和静态变量是在一起的。未初始化的全局变量和静态变量是在相邻的空间中。

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

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

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

    堆区:由用户手动申请,手动释放。在C中使用malloc,在C++中使用new(当然C++中也可以使用malloc)。

    说明:new操作符本质上还是使用了malloc进行内存的申请,因此我将自由存储区和堆区都说成堆区,不过两者还是有很大的差别。

    1)malloc是C语言中的函数,而new是C++中的操作符。

    2)malloc申请之后返回的类型是VOID*,而new返回的指针带有类型。

    3)malloc只负责内存的分配而不会调用类的构造函数,而new不仅会分配内存,而且会自动调用类的构造函数。

  • 相关阅读:
    解决ListView异步加载数据之后不能点击的问题
    android点击实现图片放大缩小 java技术博客
    关于 数据文件自增长 的一点理解
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Linux 超级用户的权利
    RAC 实例 迁移到 单实例 使用导出导入
    Shell 基本语法
    Linux 开机引导与关机过程
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Oracle RAC + Data Guard 环境搭建
  • 原文地址:https://www.cnblogs.com/BreakMind/p/2268671.html
Copyright © 2011-2022 走看看