iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0
Software Development

C++超級菜鳥也可以懂的物件導向攻略系列 第 25

Day 25 C++ Polymorphism前言 - Dynamic memory和Pointer to structures

  • 分享至 

  • xImage
  •  

前言:如同之前章節提到的,在我們declare variable的時候,已經跟電腦確定好所需的空間,而且不。能。更。改。
假設declare一個空白的variable,例如:int age;,電腦也是空出4 bits的空間出來。
或是做出一個array arr[3];,這樣就是說有三格。
以上稱為static memory靜態記憶體。

而Dynamic memory是可以在程式一邊跑的時候,再來看看需要空出什麼空間、多少空間。
可以用在variable、array跟tree之類的linked結構,通常都是在array陣列上使用比較多。


Dynamic memory動態記憶體分配

電腦中有個預留空間專門給程式執行時用的一塊記憶體,我們就是使用這塊。(但因為畢竟是預留空間,是有限的,所以如果用掉太多是有可能會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 intnew charnew doublenew 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


上一篇
Day24 - C++ 虛擬貨幣程式Crypto bot - 顯示虛擬貨幣資料 File I/O, filesystem和資料儲存 Filestoring
下一篇
Day 26 C++ 物件導向7 Polymorphism
系列文
C++超級菜鳥也可以懂的物件導向攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言