C 内存管理初步了解

1 首先变量了解几个概念

  静态变量:用 static 修饰的变量

  局部变量: 存储在栈区;作用域是函数块内;生存期是直到函数块结束

  全局变量:存储在静态区;作用域是从定义到本源程序结束,生存期是运行期间

  静态全局变量:存储在静态区;作用域是函数块内;生存期是运行期间

  静态局部变量:存储在静态区;作用域是从定义到工程源程序结束;生存期是运行期间

2 内存的分区:一般为5大分区,栈区,堆区,静态区,常量区,代码区(内存地址从高到底)

  栈区:

    *函数参数以及局部变量存储的区域

    *栈区的存储空间由高向低分配,由低向高存储

    *栈区的内存由系统负责分配和回收,开发者没有权限,定义局部变量时由系统分配空间,局部变量被销毁时,由系统回收存储空间,但是存储空间的数值并没有被清空; 

 
   
   

    *栈的特点:先进后出,后进先出。由栈底开始分配内存,栈顶是最后分配内存的位置

    *栈区会存在安全问题,在函数中返回栈内存是不安全的

    *栈区的空间是有限的(7M-8M之间),之所以系统运行不崩溃的原因是:栈区空间在频繁的开辟和释放

  堆区:

    *由开发者自主管理的区域

    *由开发者手动开辟内存,手动释放内存

    *忘记回收会造成内存泄露,从而导致崩溃

    *程序运行结束后会自动回收堆区内存,但是如果不及时回收堆区内存,程序运行期间很有可能是因为内存泄露导致内存被全部占用,程序无法运行。

  静态区:也称全局区、数据区

    *全局变量和静态变量存储的区域

    *当全局变量和局部变量同时出现在同一区域时,全局变量被暂时屏蔽。

    *静态区的存储空间由系统回收和分配    

    *程序运行结束后,静态区的存储空间被回收,静态区变量的生命周期和程序一样长,静态变量的空间只有程序退出才释放

    *静态变量只能初始化一次(在编译时初始化),在程序运行期间可以修改值

    *静态变量如果没有设置初始值,默认值为0

    *静态区分为两部分:一部分存储赋初值的全局变量和静态变量,一部分存储没有赋初值的

  常量区:

    *常量存储常量区

    *常量区内存空间由系统分配和回收

    *程序运行结束后,常量区的存储空间被回收

    *常量区的数据只能被读取,不能被修改(强行修改会导致程序崩溃)

  代码区:

    *所有语句编译的CPU指令存储的区域(函数体的二进制代码)

    *由系统回收和开辟

    *只能读取,不能修改

    *在程序运行结束后,才会自动回收

时间: 2024-11-09 08:24:51

C 内存管理初步了解的相关文章

C++中的简单内存管理---初步认识

OC里面给变量赋值有2种方法第一种是直接用下划线的,也就是实例变量:_button=       第二种是使用属性:self.button = ....这两种有何区别??? 以下项目是创建了一个C++项目   简单模拟创建对象和给变量赋值的情况 首先创建了一个NSObject类,在OC里面继承NSObject类的都有retain  release  autorelease....等方法来管理内存的 NSObject的头文件,声明方法 // // NSObject.h // autorelease

拆箱装箱 页面跳转 及内存管理 0905蓝懿教育

拆箱装箱 数组中只能装入对象,而很多时候我们需要把类似Int 或者结构体这种装入 此时我们需要进行拆装 基本思想是 把类似int还有结构体 转换成相对应的对象 然后加入数组 ,导出时 要从对象型变成对应的int或者结构体类 @property NSmutableArray *ages; self.ages=[NSmutableArray  Array]; int x=1; NSnumber *objectnumber=x; [self.ages addobject:objectnumber];

进程管理、内存管理、存储管理初步了解

进程管理 进程需要一定的资源(包括CPU时间.内存.文件.I/O设备)以完成其任务.这些资源可以在进程创建时分配给进程,也可以在执行进程时分配给进程.除了在创建时得到各种物理和逻辑资源外,进程还可以接受传输过来的各种初始化数据(输入). 需要注意:程序本省并不是进程,程序是被动的实体,而进程是一个活动的实体. 进程与线程的定义: 进程是具有一定独立功能的程序关于某个数据集合上的依次运行活动,进程是系统进行资源分配和调度的独立单位. 线程是进程的一个实体,是CPU和分配的基本单位.线程自己基本不拥

初步swift语言学习笔记6(ARC-自己主动引用计数,内存管理)

笔者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/31824179 转载请注明出处 假设认为文章对你有所帮助.请通过留言或关注微信公众帐号fengsh998来支持我,谢谢. Swift使用自己主动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不须要考虑内存的管理. 当实例并不再被须要时.ARC会自己主动释放这些实例所使用的内存. 另外须要注意的: 引用计数仅仅

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

垃圾回收GC:.Net自动内存管理 上(一)内存分配

垃圾回收GC:.Net自动内存管理 上(一)内存分配 前言 .Net下的GC完全解决了开发者跟踪内存使用以及控制释放内存的窘态.然而,你或许想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包含非常详细的内在算法描述.同时,还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 引子 为你的应用程序实现合理的资源管理是一件困难的,乏味的工作.这可能会把你的注意力从你当前正在解决的实际问题中转移到它身上.那么,如果有一个现有的机制为开发者管理令人厌恶的内存管理,会

Android 内存管理 &Memory Leak & OOM 分析

1.Android 进程管理&内存 Android主要应用在嵌入式设备当中,而嵌入式设备由于一些众所周知的条件限制,通常都不会有很高的配置,特别是内存是比较有限的.如果我们编写的代 码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得Android应用程序安全且快速的运行,Android 的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程演变过来的,也就是说每个应用程序都是在属于自己的进程中运行的.一方面,如果程序在运行

Linux内核之内存管理完全剖析

linux虚拟内存管理功能 ? 大地址空间:? 进程保护:? 内存映射:? 公平的物理内存分配:? 共享虚拟内存.实现结构剖析 (1)内存映射模块(mmap):负责把磁盘文件的逻辑地址映射到虚拟地址,以及把虚拟地址映射到物理地址 (2)交换模块(swap)负责控制内存内容的换入与换出,淘汰最近没访问的页,保留最近访问的页. (3)core(核心内存管理模块):负责内存管理功能. (4)结构特定模块:实现虚拟内存的物理基础 内核空间和用户空间 Linux简化了分段机制,使得虚拟地址跟线性地址一样.

深入详解python传值问题及内存管理机制

在比较浅层次上我们通过说明如下问题来进一步深入了解python内存管理机制: python中到底是"传引用"还是"传值"呢??? 这个问题的回答是:看情况.有的是传值,有的是传引用. 判断的依据是看对象的可变性,而这一点又取决于对象的类型.故在python中的说法是对象可变的还是不可变的. 基本数据类型(整型及其他数据类型,字符串)及元组是不可变的,参数传递的是形参,也就是传过来的是原值的一个拷贝,在函数中改变形参的值实参不会发生变化: def func(a) 列表