1. 程式人生 > >C++記憶體儲存區域:堆區棧區以及new delete

C++記憶體儲存區域:堆區棧區以及new delete

C/C++記憶體大概有:
1:棧區,它是有系統自動分配和釋放,速度快效率高,但不自由;區域性變數,函式引數,返回值等都儲存在這個區域。
2:堆區,它是由程式設計師能過new或malloc自己分配的,不過在不需要的時候也需要自己通過delete和free釋放記憶體。很靈活。
3:全域性或靜態儲存區域:存放全域性或靜態變數。其中初始化的變數放在一塊區域,未初始化的放在另一塊區域。
4:常量區域:存放常量的
new是用來分配一個堆空間,當new一個記憶體區域時,編譯器會查詢系統中空閒塊鏈,找到第一個記憶體大於所需要的記憶體塊分配給new,於是new便返回該記憶體的首地址,而該變數本身是沒有名字的,都是通過指標來進行操作。
delete是釋放new出來的堆空間,把以new和delete要匹配。
同時是new和delete匹配,new[]和delete[]匹配,若不匹配可能會產生記憶體釋放不徹底或過多釋放記憶體的情況。
int *p=new int;
其中p是存放在棧區的,而開闢出一個Int型別的儲存區域是放在堆區中,p裡面存放的是開闢出來的記憶體區域的首地址。
由於p在棧區,所以它是自動釋放的,但開闢出來的記憶體區是在堆區,不能自動釋放,所以一般在程式結束前把堆區釋放掉,棧區會有系統自動釋放。
int a=0;
int *p=&a;
delete p;
這個是錯誤的,delete這是要釋放a的儲存空間,但a是放在棧區由系統自動分配,不需要delete.