内存划分
在C++中内存分为5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区。
栈:保存局部变量。栈空间用来存放函数运行时的参数值和局部变量,当一个函数运行结束时,在这个函数中声明的局部变量也会自动销毁。栈的特点是无需人工管理但空间大小有限。
堆:由malloc(C++程序员因避免使用)或者new运算符分配的内存。其生命周期由free(和malloc对应)或delete(释放new分配的空间)决定。堆中占用的空间在没有释放之前会一直存在,直到程序结束。堆的特点是自由度高,空间比较大,但程序员必须通过代码释放,容易出错。
静态区:保存全局变量和static变量(包括static全局和static局部变量)。静态区的内容在整个程序的生命周期内都存在,由编译器在编译的时候分配。
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量(const),不允许修改。
代码区:存放函数体的二进制代码。
new运算符不仅会分配大小正确的内存空间,而且还会返回新空间的地址,最后地址信息被保存在=前面声明的指针中。
空指针指向的内存区域为内存的首地址,是不可读写的区域,即空指针不提供操作。删除空指针是安全的(因为它什么也没做)。
C++标准规定:delete空指针是合法的,没有副作用。所以我们在Delete指针后赋值为NULL或0是个好习惯。对一个非空指针delete后,若没有赋NULL,若再次delete的话有可能出现问题。
int *ptr = new int(3);
delete ptr;
ptr = NULL;
可以看出delete是释放指针指向的内存,并不是指针本身所占有的内存。所以delete后,指针的还是指向那块区域,并未清0,所以如果下次用到,就会发生xxx空间不能访问的异常。以后delete后要赋值为空。