1、第一种:自动分配内存,常与局域变量联系在一起,一个局域变量值在程序执行到该变量定义的时候才会由系统自动分配内存给它,当包含该变量的定义的模块结束的时候,该变量占用的内存自动释放。需要注意的是:当一个变量占用的空间被释放以后,任何指向它的指针都将变得无效。例如:
int* invalid_pointer()
{
int x;
return &x;//这里是取地址运算符号
}
该函数返回了一个局域变量的地址,但是函数返回之后,局域变量的空间会被释放,所以返回的指针是无效的,将会指向一个不可预料的值!而且系统也不会报错!
int* invalid_pointer()
{
static int x;//这个方法才正确,加一个static关键字(静态变量)
return &x;
}
2、第二种:动态分配内存:通过new和delete这两个关键字实现,一般要结合指针一起使用
int *p = new int (42);//p指向一个没有命名的对象(但是内存是新分配的)
++ *p;//此时p为43
delete p;//注意删除的是指针
通常来说,new T[n]这样的语句中, 如果T是内建类型,那么数组只是在局部作用域分配内存,不会被初始化,如果T是一个类,那么数组中的每个元素都会缺省初始化。
内存的三种分配方式: 1. 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。 2. 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。 3. 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题。