内存区域

5个内存区域:

全局名称空间;自由存储区;寄存器;代码空间;堆栈

局部变量和函数参数位于堆栈中;代码位于代码空间中;全局变量位于全局名称空间中;寄存器用于内部管理工作,如记录栈顶指针和指令指针;余下的所有内存都被作为自由存储区,通常被称为堆。

可以讲自由存储区域视为一块很大的内存,其中有数以千计的依次被编号的内存单元,可用于存储数据。与堆栈不同,不能堆这些单元进行标记,而必须先申请内存单元的地址,然后将它存储到指针中。

自由存储区的优点是,从中分配的内存将一直可用,直到明确指出不再需要将其释放。如果在内存中分配自由存储区中的内存,在函数返回后该内存仍可用。这也是自由存储区的缺点,如果忘记释放内存,被占据而没有使用的内存将随着时间的推移越来越多,导致系统崩溃。

采用这种内存访问方式而不是全局变量的优点是,只有能够访问指针的函数才能访问它指向的数据。这样,只有将包含指针的对象或指针本身传递给函数,函数才能够修改指针指向的数据,从而减少了函数能够修改数据而又无法跟踪变更的情况发生。

在C++中,使用关键字new来分配自由存储区中的内存。在new后面跟上要为其分配内存的对象的类型,让编译器直到需要多少内存。new的返回值是一个内存地址。内存地址被存储在指针中,因此应将new的返回值赋给一个指针。例如要在自由存储区中创建一个unsigned short变量,可如此操作:

unsigned short int * pPointer;

pPointer=new unsigned short int;

也可在声明指针的同时对其进行初始化:unsigned short int * pPointer=new unsigned short int;

无论采用哪种方式,pPointer都将指向自由存储区中的一个unsigned short int。可以想使用其他指向变量的指针那样使用它,将一个值赋给它指向的内存区域:* pPointer=72;

该条语句的含义是:将72放在pPointer指向的区域中或将72赋给pPointer指向的自由存储区中的区域。

使用完内存区域后,必须将其归还系统。可以将delete应用于指针。delete将内存归还给自由存储区。切记,使用new分配的内存不会被自动释放。如果指针变量指向自由存储区中的内存块,离开该指针的作用域时,该内存块不会被自动归还给自由存储区。相反,该内存块已被视为已分配出去,同时由于该指针不再可用,将无法访问该内存块。当指针为局部变量时将发生这样的情况。当函数返回时,在该函数中声明的指针不再作用域中,从而丢失。使用new分配的内存不会被释放,而是变得不可用。这被称为内存泄露,因为在程序结束前该内存块再也无法使用。

delete pPointer;

最常见的情况是,在构造函数中从堆中分配内存,在析构函数中释放这些内存。

posted @ 2017-10-09 21:06  Shaine  阅读(129)  评论(0编辑  收藏  举报