c++中的記憶體操作關鍵字
總結c語言中可以使用malloc、calloc、realloc來開闢堆區記憶體,使用free來釋放堆區記憶體
c++中用new來開闢堆區記憶體,在堆區開闢的資料需要程式設計師手動釋放,用delete來釋放
void
* malloc (size_t size)
;
這個函式可以用來向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標
使用示例:
// malloc了一塊大小為乙個整型的空間,將其void*的返回值強轉為int*,賦給int*型別的變數p1接收
int* p1 =
(int*)
malloc
(sizeof
(int))
;// malloc了一塊大小為8個整型的空間,將其void*的返回值強轉為char*,賦給char*型別的變數p2接收
char
* p2 =
(char*)
malloc
(sizeof
(int)*
8);
void
* calloc (size_t num, size_t size)
;
如果對申請的記憶體空間的內容要求初始化,那麼可以很方便的使用calloc函式來完成任務
使用示例:
// calloc了6塊大小為乙個整型的空間,共6個位元組,將其全部初始化為0,並將其void*的返回值強轉為int*,賦給int*型別的變數p3
int* p3 =
(int*)
calloc(6
,sizeof
(int))
;// calloc了8塊大小為5個整型的空間,共40個位元組,將其全部初始化為0,並將其void*的返回值強轉為char*,賦給char*型別的變數p4
char
* p4 =
(char*)
calloc(5
,sizeof
(int)*
8);
realloc函式的出現讓動態記憶體管理更加靈活
有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了。為了合理的使用記憶體,我們一定會對記憶體的大小做靈活的調整。realloc 函式就可以做到對動態開闢記憶體大小的調整
void
* realloc (
void
* ptr, size_t size)
;
realloc在調整記憶體空間時存在4種情況:
調整之後的記憶體 < 原空間大小:原空間尾部的記憶體被拿掉,只剩餘調整之後的大小,內容只保留調整之後的部分
調整之後的記憶體 = 原空間大小:原空間大小和其中的內容不發生改變
調整之後的記憶體 > 原空間大小,且原空間後面有足夠的連續空間:在原空間後面開闢新增的空間大小
調整之後的記憶體 > 原空間大小,且原空間後面沒有足夠的連續空間:重新開闢一塊調整之後大小的連續空間,把原空間的資料拷進去
因為realloc在申請對空間對原空間進行擴容時,可能存在後面沒有足夠連續空間的情況,因此使用方法和前面幾個有所區別:
// malloc了一塊大小為20位元組的空間,將其void*的返回值強轉為int*,賦給int*型別的變數p5
int* p5 =
(int*)
malloc(20
);// 將p5的記憶體擴大到1000位元組
p5 =
(int*)
realloc
(p5,
1000);
// 上面這段**看似沒有什麼問題,其實不然;若原來的p5空間後面沒有連續的980位元組供realloc擴容
// 則realloc會在記憶體中重新尋找一塊1000位元組的連續空間,把原空間的資料拷進去,再把新空間的名字改為p5
// 此時原空間的資料沒有釋放掉,若不小心對這段空間進行訪問,就會發生意想不到的情況
// 正確的用法是這樣的:
// malloc了一塊大小為20位元組的空間,將其void*的返回值強轉為int*,賦給int*型別的變數p6
int* p6 =
(int*)
malloc(20
);int* p7 =
null
;// 將p6的記憶體擴大到1000位元組,並賦給p7
p7 =
(int*)
realloc
(p6,
1000);
if(p7 !=
null
)
void free (
void
* ptr)
;
free函式用來釋放動態開闢的記憶體,動態開闢的空間一定要釋放,並且正確釋放。
double
* p =
(double*)
malloc
(sizeof
(int)*
40);free
(p);
申請和釋放單個元素的空間,使用new和delete操作符;申請和釋放連續的空間,使用new[ ]和delete[ ]
語法:new 資料型別
利用new建立的資料,會返回該資料對應的型別的指標
// 動態申請乙個int型別的空間
int* ptr4 =
newint
;// 動態申請乙個int型別的空間並初始化為10
int* ptr5 =
newint(10
);// 動態申請10個int型別的空間
int* ptr6 =
newint[3
];
delete的使用方法:
int
* ptr4 =
newint
;int
* ptr5 =
newint(10
);int* ptr6 =
newint[3
];delete ptr4;
delete ptr5;
delete
ptr6;
其實,c++中的new和delete關鍵字在底層仍是由malloc和free通過operator過載實現的
malloc/free
new/delete
malloc/free是函式
new/delete是運算子
malloc可以按位元組申請,得到的指標無型別,使用時一般需要強轉
new在申請時就寫明了型別,得到的指標有型別,不需要強轉
malloc申請失敗時,返回null,因此需要判空
new申請空間失敗時,拋異常
申請自定義型別空間時,malloc/free不會呼叫構造/析構函式
申請自定義型別空間時,new/delete會呼叫構造/析構函式進行初始化和清理工作
使用malloc申請的記憶體,理論上可用delete釋放,但可讀性很差,因此需要配對使用
使用new申請的記憶體,若使用free釋放可能會因無法執行析構函式而出錯
C C 動態記憶體管理
一 c語言中動態記憶體管理方式 c語言中使用 malloc calloc realloc free進行記憶體的管理和釋放 1.malloc動態記憶體申請 int ptest int malloc 10 sizeof int 申請記憶體的方式 free 釋放 2.calloc 該函式會將申請的記憶體空...
C C 動態記憶體管理
注意malloc free new delete new delete一定要匹配使用,否則可能出現記憶體洩漏甚至崩潰的問題小結 1 兩組函式都負責動態記憶體管理 2 malloc free是c c 標準庫的函式,而new delete是c 操作符。3 malloc free只負責動態分配空間 釋放空...
C C 動態記憶體管理
c語言動態記憶體管理 malloc calloc realloc free int p1 int malloc sizeof int malloc返回值型別為void int p2 int calloc 1,sizeof int 動態分配並初始化為0 int p3 int realloc p1,si...