C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

1 C++内存管理详解

1.1内存分配方式

如下图:

     在c++中,内存分成5个去,分别是堆、栈、自由储存区、全局/静态储存区。

  栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

  堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

  自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

  全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

  常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

1.2常见的内存错误

*内存分配未成功,却使用了它

申请的时候要判断是否为NULL

*内存分配成功,尚未初始化就引用它

*内存分配成功,且已经初始化,但是操作越过了内存的边界

*忘记释放内存,造成内存泄漏

*释放了内存,却继续使用(野指针)

    【规则1】用mallocnew申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。

  【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。

  【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。

  【规则4】动态内存的申请与释放必须配对,防止内存泄漏。

  【规则5】用freedelete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

 

posted @ 2016-07-07 17:51  叫我二当家  阅读(237)  评论(1)    收藏  举报