内存知识-笔记

感谢:http://www.cnblogs.com/iuices/archive/2011/11/24/2262324.html

1.C和C++的编译器把私有内存分为3块:基栈、浮动栈和堆。

基栈:也叫静态存储区,这是编译器在编译期间就已经固定下来必须要使用的内存,如程序的代码段、静态变量、全局变量、const常量等

浮动栈:很多书上称为“栈”,就是程序开始运行,随着函数、对象的一段执行,函数内部变量、对象的内部成员变量开始动态占用内存,浮动栈一般都有生命周期,函数结束或者对象析构,其对应的浮动栈空间的就拆除了,这部分内容总是变来变去,内存占用也不是固定,因此叫浮动栈。

堆:C和C++语言都支持动态内存申请,即程序运行期可以自由申请内存,这部分内存就是在堆空间申请的。堆位于2GB的最顶端,自上向下分配,这是避免和浮动栈混到一起,不好管理。我们用到malloc和new都是从堆空间申请的内存,new比malloc多了对象的支持,可以自动调用构造函数。另外,new创建对象,其成员变量位于里面。

2.虚拟内存的基本思想是:用廉价但缓慢的磁盘来扩充快速却昂贵的内存。

3.使用内存时最容易出现的bug

(1)坏指针值错误:

指针赋值之前就用它来引用内存,或者向库函数传送一个坏指针,第三种可能导致坏指针的原因是对指针进行释放之后再访问它的内容

可以修改free语句,在指针释放之后再将它置为空值。

free(p); p = NULL;

 这样,如果在指针释放之后继续使用该指针,至少程序能在终止之前进行信息转储。

(2)改写(overwrite)错误:

越过数组边界写入数据,在动态分配的内存两端之外写入数据,或改写一些堆管理数据结构(在动态分配内存之前的区域写入数据就很容易发生这种情况)

p = malloc(256);

p[-1] = 0; p[256] = 0;

(3)指针释放引起的错误:

释放同一个内存块两次,或释放一块未曾使用malloc分配的内存,或释放仍在使用中的内存,或释放一个无效的指针

Coding
原文地址:https://www.cnblogs.com/ccie-leon-43093/p/5372484.html