前言:如同之前章節提到的,在我們declare variable的時候,已經跟電腦確定好所需的空間,而且不。能。更。改。
假設declare一個空白的variable,例如:int age;
,電腦也是空出4 bits的空間出來。
或是做出一個array arr[3];
,這樣就是說有三格。
以上稱為static memory靜態記憶體。
而Dynamic memory是可以在程式一邊跑的時候,再來看看需要空出什麼空間、多少空間。
可以用在variable、array跟tree之類的linked結構,通常都是在array陣列上使用比較多。
電腦中有個預留空間專門給程式執行時用的一塊記憶體,我們就是使用這塊。(但因為畢竟是預留空間,是有限的,所以如果用掉太多是有可能會error的喔。)
那該如何告訴電腦我們想取用這塊執行時專用記憶體?
可以用關鍵字指令new
~
new跟用之前提過的pointer有什麼不同?,
這個new會依照我們的指令(資料型態和大小)在執行記憶體中空出一個新的variable, aka新的空間,然後傳回原本那個指令的記憶體位址。
注意這個new指令清出的variable沒.有.名.字!
因為沒有名字,要找只能用”記憶體位址“,沒辦法用名字標籤找,也就是說我們無法用variable\array名字來找到,所以需要用到pointer。
之前在declare指標時我們都有給名字的,如以下的age_memory_address是variable,age的記憶體位址儲存的地方是有名字的,age_memory_address就是variable的名字,
int age; int *age_memory_address; age_memory_address = &age;
關於上面的
*
還有&
是什麼,請搭Pointer是什麼直通車。
而new的會變成這樣用:
int *age_memory_address;
age_memory_address = new int; //生出一塊在執行記憶體可以放int的空間
簡單來說就用用一個沒有名字的variable來產生這個指標,然後預留的這塊記憶體(在稱為heap的記憶體中)就會產出一個空間,看想產出double, int還是char
等等不同資料類別的東西,那這個空間只能由"沒有名字variable的地址"取用。
然後記得一定要給new這個指令,這個裡面裝的是什麼data type的東西,例如:new int
、new char
、new double
、new string
等等這樣。
因為這種記憶體會一直保存直到程式結束為止,只要不刪就會一直佔著空間,為了防止這個run time專用記憶體滿了跑不動,我們需要適時的刪除用不著的空間,把空間歸還給(heap)記憶體。
可以直接用叫做delete的指令
:
delete age_memory_address; //刪除這個指標pointer的記憶體位址
啊請記得,這不是刪除指標,是刪除他儲存的記憶體位址。
如果要新增或是刪除array,請看以下範例:
int *age;
age = arr[6];
delete [] age;
Reference: Practical C++ programming, cplusplus.com, microsoft