動態記憶體分配技術可以保證程式在執行過程中按照實際需要申請適量的記憶體,使用結束後可以釋放,這種在程式執行過程中申請和釋放的儲存單元稱為堆物件,申請和刪除過程一般稱為建立和刪除
建立堆物件
語法形式
new 資料型別 (初始化引數列表);
執行該語句申請分配用於存放指定型別資料的記憶體空間,並依據初始化列表中給出的值進行初始化。如果申請成功,new運算便返回乙個指向新分配記憶體首位址的型別的指標,可以通過這種指針對堆物件進行訪問;若申請失敗,丟擲異常。
刪除堆物件
語法形式
delete 指標名;
功能:釋放指標p指向的記憶體(不刪除指標)必須是new操作的返回值。
用new分配的記憶體,必須用delete釋放,否則導致分配的記憶體無法收回,使程式佔據的記憶體越來越大,叫做記憶體洩漏。
例 動態建立物件
//6_16.cpp
#include
using
namespace std;
class
point
point
(int x,
int y):x
(x),
y(y)
~point()
intgetx()
const
intgety()
const
void
move
(int newx,
int newy)
private
:int x, y;};
intmain()
建立一維動態陣列的語法形式
new 型別名 [陣列長度];
釋放一維動態陣列的語法形式
delete 指標名;
例:動態建立物件陣列(點類構造與上例相同,故省略)
int
main()
多型建立多維陣列的語法形式
new 型別名 t [陣列第一維長度][陣列第二維長度]。。。。;
例
char (* fp)[3];
fp=new char[2][3];
//6_19.cpp
#include
using
namespace std;
intmain()
cout << endl;
}delete
cp;
return0;
}
迴圈遍歷陣列的時候也是從第乙個方括號的數字開始,一維巢狀下一維。程式中的指標形式和陣列名下標形式是等價的,之前在用指標表示陣列元素時說過。
使用動態記憶體分配操作實現了陣列的動態建立,使陣列元素的個數可以根據執行時的需要建立,但是建立和刪除陣列的過程使程式繁瑣,有更好的方法是將陣列的建立和刪除過程封裝起來,形成乙個動態陣列類。
通過類的成員函式訪問陣列元素時,可以在每次訪問之前檢查一下下標是否越界。
例 動態陣列類
#include
#include
using
namespace std;
class
point
;//動態陣列類
class
arrayofpoints
~arrayofpoints()
//獲得下標為index的陣列元素
point &
element
(int index)
private
: point *points;
//指向動態陣列首位址
int size;
//陣列大小};
intmain()
為了避免建立和刪除陣列的繁瑣,本例將陣列的建立和刪除封裝起來形成乙個類。在主函式開始處建立了物件陣列,使用者輸入的count值傳到動態陣列類的建構函式中,執行函式體中的動態記憶體分配,points指標變數名獲得了物件陣列的首位址。主函式中的element成員函式則是得到返回指標位址的作用,同時用assert還可以檢查下標越界。得到物件陣列兩個元素後,就與原來的例題相同了。
值得注意的一點是 element成員函式返回值型別是引用型別的,因為此處返回的是陣列名和下標,相當於將原來的值複製乙份返回,但是我們需要修改原來的值,所以必須要返回引用 是「左值"可以被賦值修改的。
智慧型指標
c++11 的智慧型指標
c語言動態記憶體分配 C 動態記憶體分配
動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...
c 動態記憶體分配
c語言中提供的動態記憶體分配為了解決陣列的靜態的分配方式的問題 即陣列大小必須在定義時指定,程式在執行時不能動態改變陣列的大小 在標準庫中提供了三個動態記憶體分配的函式供程式呼叫,下面將分別對這三個函式進行介紹 1.void malloc size t size malloc 在分配一段連續的記憶體...
C 動態記憶體分配
c 動態記憶體分配 c c 定義了4個記憶體區間 區,全域性變數與靜態變數區,區域性變數區即棧區,動態儲存區,即堆 heap 區或自由儲存區 free store 堆的概念 通常定義變數 或物件 編譯器在編譯時都可以根據該變數 或物件 的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確...