1.5 使用new創建動態結構和自動, 靜態, 動態三種存儲方式

1. 有些時候在運行時創建數組由於在編譯時創建數組(有些時候不是這樣, 比如使用OpenGL繪圖和GPU並行計算結合的時候, 需要將大量的數據傳送到顯存, 每次計算完又要傳送回宿主機渲染, 但並不是要傳送回所以值, 有些值可以仍然留在顯存中, 對於這些值, 顯然一次創建最恰當, 使用靜態數組最合適, 當然使用動態數組也可以, 但是隻需創建一次就可以了), 對於結構體也是這樣.

2. C++中的結構體. 有兩種方式, 一種是動態方式, 一種是靜態方式. 使用new一般是動態方式, 一般是與指針搭配, 靜態方式是直接聲明的.
    struct price{
         int apple;
         int orange;
     };
     靜態方式, 是結構體類型數據, 類似於int類型數據的聲明方式, 如price p1={100,200};或者price p1; p1.apple=100; p1.orange=200; 靜態方式是結構體類型數據, 訪問結構體成員的時候採用句點操作符, 例如p1.apple, p1.orange.
     動態方式, 結構體指針類型數據, 採用箭頭操作符訪問結構體成員, 如price * p2=new price; p2->apple=100; p2->orange=200; 當然也可以通過這樣的方式採用句點操作符訪問結構體成員. 例如對於結構體指針price *p3=new price;(這裏創建了一個結構體, 將結構體的首地址返回給等號右邊, 並賦給指向此結構體的指針p3, 不能直接寫成price *p3, 這樣只是創建了一個指針, 並沒有創建結構體), p3是指向結構體的指針, 那麼使用解除引言操作符*可以得到結構體本身, 即*p3是結構體本身, 那麼訪問成員的方式可以這樣(*p3).apple, (*p3).orange.

3. 使用new動態分配內存, 並釋放內存一遍重新使用. 下面的代碼使用了返回指針的函數.

4. 三種存儲方式: 自動存儲, 靜態存儲, 動態存儲.
   自動存儲: 函數內部定義的常規變量使用自動存儲空間, 稱爲自動變量(也稱局部變量), 如getname函數中的temp, pn. 他們在所屬的函數被調用時自動產生, 在該函數結束時消亡, 例如getname函數中的temp只在getname函數被調用時存在, 當調用結束時, temp使用的內存將被自動釋放, 如果getname返回temp的地址, 則main函數name指向的內存將很快被重新使用, 因此我們必須在getname中使用new並獲取一個副本.
   靜態存儲: 靜態存儲是在整個程序執行期間都存在的存儲方式, 在函數外聲明它或者使用關鍵字static.
   動態存儲: new和delete提供了比自動變量和靜態變量更靈活的方法. 他們管理一個內存池, 也成爲自由存儲空間. 內存池通用語靜態變量和自動變量的內存是分開的. new和delete是程序員對程序如何使用內存有更大的控制權.

5. 堆棧, 堆和內存泄漏. 如果使用了new, 沒有調用delete, 即使包含指針的內存由於作用域規則和對象生命週期的原因而被釋放, 但是在自由存儲空間上動態分配的變量或者結構也將繼續存在, 但是將會無法訪問這些內存, 因爲指向這些內存的指針無效了.這將導致內存泄漏. 被泄漏的內存將在程序的整個生命週期內鬥不可使用, 這些內存被分配出去, 但無法收回, 可能導致可用內存耗盡, 程序崩潰. 我們要養成一種好習慣, 成對的使用new和delete, 在自由存儲空間上動態分配內存, 隨後便釋放它.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章