您的位置:首页 > 其它

内存管理

2016-01-20 10:54 281 查看
1、C程序运行时的内存结构

静态数据区:全局变量,static修饰的局部变量
代码区        : 程序指令,大部分字面常量
栈区          :函数形参,局部变量(大部分)
堆区          :动态分配的内存
寄存器组    :函数形参,局部变量(小部分)


2、变量生存期

定义:一个变量占有内存空间的时间段

C++将变量的生存期分为3种:静态、自动、动态

静态生存期:全局变量都具有静态生存期,其内存空间从程序开始执行进行分配,程序结束收回
自动生存期:局部变量和函数形参具有自动生存期,其内存空间从程序执行到函数体时分配,函数结束时收回
动态生存期:此类变量生存时间由程序员控制,其内存空间用malloc函数分配,用free 函数收回


3、内存空间的动态分配

动态分配内存空间步骤:
a.定义一个指针变量
b.申请一块内存空间,并将其首地址赋给指针变量,此时即可通过指针变量访问这块内存空间
c.用完后释放这块内存空间

示例:
void *p = nullptr;
p = malloc(50);
.....
free(p);

注:
刚分配的动态内存的初始值不确定,须对其进行初始化;
不能对同一指针(地址)连续free两次;
不能对指向全局变量(静态内存区)和局部变量(栈内存区)的指针进行 free,但可对空指针进行 free (可连续 free);
对一个指针应用free之后,其值不会发生改变,但其指向一个无效内存区;
若未及时释放动态内存,并且将指向该内存块的指针指向了别处,就会造成“内存泄露”;

在进行内存空间申请时,须避免发生以下错误:
a.内存分配未成功,却使用了它
b.内存分配成功,但尚未初始化就进行引用(误以为初始值为0)
c.内存分配成功且已初始化,但操作越过内存边界
d.未释放内存,导致内存泄露
e.释放了内存空间却继续使用

悬空指针:不为NULL且没有指向有效内存地址的指针变量(即将内存空间 free 后未将指针置为NULL)
注:通过悬空指针访问其所指向的内存区域将发生不可预知的错误
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: