栈区:
存储的数据只在函数内有效,超出函数就消失了。在栈区程序员可以为某个内存单元命名。
堆区:
堆区可以存储比较大的数据,而且存储的数据只要不是程序员手动将其释放,那么就会永远保存在堆区中。堆是一大堆不连续的内存区域,在系统中由链表将他们串接起来,堆区中的内存单元都是匿名的,不可以被命名,所以使用堆区的空间需要用指针记录该内存单元的地址,然后通过指针去访问。
在C++中,使用new创建一个堆并分配内存,在new后面跟一个要分配的对象类型,编译器根据这个类型来分配内存。如:
int *p = new int;//在堆区创建一个int类型的内存区域,将地址赋给指针p,这块内存区域为4字节。
delete p;//回收内存区域
由于使用new创建的内存空间不会被系统自动释放,因此假如你不去释放它,那么该区域的内存就永远不能为其他数据所使用。而指向该内存区域的指针是个局部变量,当定义该指针的函数结束并返回时,指针也就消失了,那么如果不记得该内存地址,就再也无法访问该内存区域,就好像丢失了这块内存一样,这种情况叫做内存泄漏。
注意:由于计算机的内存是有限的,因此可能会出现没有足够的内存而无法满足new的请求。在这种情况下,new会返回0,该值被赋给指针后,指针就是一个空指针。空指针不会指向任何有效数据。new除了返回空值以外还会引发异常。
全局区:
保存的数据只有程序运行结束才会释放,而且很容易被修改。