分类: C /C |
C/C++程序运行时的内存结构:
(1)全局变量、用static修饰的局部变量都存储在静态数据区
(2)程序指令和大部分字面常量都存储在代码区
(3)大部分函数的形参和局部变量都存储在栈区
(4)程序中动态分配的内存都存储在堆区
(5)一小部分函数形参和局部变量存储在CPU寄存器组中
使用malloc和free的注意事项:
(1)刚刚分配的动态内存的初始值是不确定的
(2)不能对同一指针(地址)连续两次进行free操作
(3)不能对指向静态存储区(全局变量)或内存区局部变量)的指针应用free(但可以对空指针NULL应用
free)
(4)对一个指针应用free之后,它的值不会改变,但它指向了一个无效的内存区,这时称该指针为“悬
空指针”
(5)如果没有及时释放某块动态内存,并且将指向它的指针指向了别处,就会造成“内存泄露”
(6)执行malloc和free含糊有一定的代价,所以对于较小的变量不应该放在动态内存之中,并且尽量避
免频繁的分配和释放动态内存
使用堆内存时的常见错误:
(1)内存分配未成功,却使用了它
(2)内存分配虽然成功,但是尚未初始化就引用它。(误认为初始值为0)
(3)内存分配成功并且已经初始化,但操作越过了内存的边界
(4)忘记了释放内存,造成了内存泄露
(5)释放了内存却继续使用它
关于悬空指针:
(1)一个指针变量,如果不为NULL且没有指向有效的内存地址,都称为“悬空指针”
(2)通过悬空指针访问其指向的内存区会使程序产生不可预知的错误
如何避免悬空指针:
(1)定义指针变量时检查对其进行正确的初始化
(2)在用free或delete释放内存之后,应及时将相应的指针置为NULL