c 的動態記憶體開闢

2021-08-18 06:00:25 字數 2585 閱讀 2795

1.棧又叫堆疊是向下生長的,該位置存放非靜態區域性變數/函式引數/返回值/指標等等

2.堆用於程式執行時動態記憶體分配,堆是向上生長的

3.資料段--存放全域性資料和靜態資料

4.**段--可執行的**/唯讀常量

常見筆試題:

如果我們對申請的記憶體空間有初始化要求就用calloc

realloc函式可以做到對動態開闢空間大小的調整,函式原型如下:

void* realloc(void* ptr,size_t size)

.ptr是要調整記憶體的位址

.調整之後新大小

.返回值是調整之後記憶體的起始位置

.這個函式在調整原記憶體大小的基礎上,還會將原來記憶體上的資料搬到新空間上.

.realloc調整空間大小有兩種情況:

(1) 原來空間後面有足夠大的記憶體空間,可以支援接在原來空間上擴容(這時不用搬運原來的資料)

(2) 原來空間後面沒有足夠大的記憶體空間,不可以支援接在原來空間上擴容.這時realloc會重新找一塊足夠大的空間,將原來資料搬到新空間上並擴容.

ptr會改變,還要釋放舊的空間(這時需要搬運原來的資料到新開的空間上)

c++通過new和delete或者new和delete進行動態記憶體管理

new和delete動態管理物件

new和delete動態管理陣列

注:一定要匹配使用new和delete;new不用計算申請空間的大小它會自動計算 例:

#include

using namespace std;

int main()

malloc和free只會開空間

new先開空間再呼叫建構函式;delete先呼叫析構函式在釋放空間

典型錯誤示範:

面試題:

malloc/free和new/delete的區別和聯絡:

1.他們都是動態管理記憶體的入口

2.malloc/free是標準庫函式,new/delete是c++的操作符

3.malloc/free只是動態分配/釋放空間,new/delete除了會分配空間還會呼叫析構函式/釋放空間還會呼叫析構函式進行初始化和清理工作.

4.malloc/free需要手動計算型別大小並且返回型別void*,new/delete會自動計算對應型別的大小並且返回對應型別.

c++的其他記憶體管理(placeman版本)

void* operator new(size_t size)

void  operator delete(size_t size)

void* operator new(size_t size)

void  operator delete(size_t size)

標準庫函式operator new()和operator delete()容易讓人誤解,與其他的operator(例:operator=)不同,operator new()和operator delete()不是new和delete的過載,實際上我們不能重定義new和delete的表示式(因為new和delete是操作符)

總結:1. operator new()/operator delete和()operator new()/operator delete()與malloc()/free()的用法是一樣的

2. 它們只負責分配物件/釋放物件的空間,不會呼叫構造和析構來進行初始化和清理工作

3. 實際上operator new()/operator delete()和operator new()/operator delete()只是malloc()/free()的一層淺封裝

由此可得new做了2件事

1.呼叫operator new()來分配空間

2.呼叫建構函式來初始化物件

由此可得delete做了2件事

1.呼叫析構函式來清理空間

2.呼叫operator delete()來釋放空間

由此可得new[n]做了2件事

1.呼叫operator new()來分配空間(每次開空間會多開4位元組來記錄n以便知道要呼叫多少次析構函式)

2.呼叫n次建構函式來初始化物件

由此可得delete[n]做了2件事

1.呼叫n次析構函式來清理空間

2.呼叫operator delete()來釋放空間

例:

C動態記憶體開闢

動態記憶體開闢 malloc calloc realloc 都是在堆上申請空間 一 malloc和free void malloc size t size 動態開闢記憶體 include include include int main int ptr int malloc 10 sizeof in...

動態記憶體開闢

記憶體分配有三種方式 1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如全域性變數,static變數 2.從棧空間分配,函式呼叫完其被自動釋放 3.從堆空間分配,即動態記憶體開闢,比如 malloc,calloc,realloc,何時申請何時釋放 malloc 函式原型void malloc s...

動態記憶體開闢

記憶體分配有三種方式 1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如說全域性變數,static變數 2.從棧空間分配,函式呼叫完成後被自動釋放 3.從對空間分配,即動態記憶體開闢,比如malloc,calloc,realloc malloc calloc realloc和free mallo...