我们知道,程序在内存中被组织成4个逻辑段:可执行代码,静态数据,动态数据(堆)和栈。
--- 可执行代码和静态数据存储在固定的内存位置。
--- 程序请求动态分配的内存来自于称为堆的内存池。
--- 局部数据对象,函数的参数以及调用函数和被调用函数的联系被防在称为栈的内存池中。
根据操作平台和编译器的不同,堆和栈既可以是被所有同时运行的程序共享的操作系统资源,也可以是使用它们的程序独占的局部资源。
在内存的全局存储空间中,用于C++程序动它分配和释放的内存块称为自由存储空间,通常也叫做堆。
1.关于new运算符和delete运算符
new运算符用于为各种数据类型,结构和数组分配内存,并把内存地址赋给响应的指针。
delete运算符把操作数指定的内存块释放回堆中,这里的操作数必须是已经分配的内存的地址。
演示代码如下:
结果如下:
注意:
对于C++程序员来说,可以忘掉std::malloc()函数和std::free()函数,而直接使用new,delete运算符来替代,因为他们使用起来更安全。
2.为大小固定的数组分配内存:
运行结果和上例完全一致。
注意:
在delete运算符之后的一对方括号,是为了告诉编译器将要释放的内存是一个数组。
3.为动态数组分配内存:
可见,数组中的元素个数也可以是一个变量。
另外,值得一提的是:
标准C的std::malloc()函数在没有内存可分配时将返回空指针不同,使用new运算符时,如果系统没有足够的内存可分配,将抛出一个运行时异常。
栈是一个后进先出的压入-弹出式数据结构。程序不会像堆那样在栈中显式的分配内存。当程序在调用函数和声明局部变量时,系统将自动分配内存。在程序运行时,系统吗每次向栈中压入一个对象,然后栈指针向下移动一个位置。当系统从栈中弹出一个对象时,最近进栈的对象将被弹出,然后栈指针向上移动一个位置。如果栈指针位置栈顶,表示栈是空的;如果栈指针在最下面的数据项之后一个位置,表示栈是满的。