動態分配記憶體

2022-04-27 15:56:05 字數 2397 閱讀 4194

動態分配記憶體專題

關於動態分配記憶體:

區域性變數在棧中分配空間,靜態變數和全域性變數在靜態儲存區分配空間,動態記憶體分配,主要是在堆中分配空間。

為什麼使用動態記憶體分配

1.宣告陣列時,必須在編譯時知道他的長度,有些陣列的長度常常在執行時才知道,若提前宣告過大的陣列,則會造成空間浪費。

2.當函式返回值為乙個指標時,需要在函式執行時進行動態記憶體分配。

分配記憶體

其中alloca可以自動釋放已分配的記憶體,但其他三個函式需要和free配合使用。

(1)malloc

void *malloc(size_t size);函式的引數直接是需要分配的記憶體位元組數,返回值為乙個指向被分配的記憶體塊起始位置的指標。如果無法提供更多的記憶體,則返回null指標,因此需要對malloc返回的指標都進行檢查,確保非null,通常和memset配合使用,一般宣告如下:

1

int *pi;

2 pi = malloc(25*sizeof(int

));3

4 cv::point * temp = (cv::point*)malloc(root_points.size()*sizeof(cv::point*));///

/強制轉換成point*

5if (temp ==null)

9 cv::point* ppt[1] =;

1011

//cv::point* ppt[1] = ;

//和4,9行的結果是一樣的,malloc返回指標,因此可以直接作為指標陣列的元素

12for (size_t index = 0; index < root_points.size(); index++)

13 ppt[0][index] =root_points[index];

14const cv::point* ppt_[1] = ;//

指標陣列初始化,二維陣列的每一行當做其元素

注意:第2行中動態開闢記憶體時,並不是sizeof(int*),因為pi是指向整型的指標,是對pi指向的位址開闢記憶體,裡面儲存的是整型數值;如果是int **pi,則後面應該是sizeof(int*);盡量不要使用11行的方式初始化,因為無法釋放,容易記憶體洩漏,4和9行可以對開闢的記憶體進行釋放,更安全。

(2)calloc

void *calloc(size_t num_elements, size_t element_size);

calloc也用於分配記憶體,與malloc有兩個區別:1.calloc分配記憶體後,返回指向記憶體的指標之前會把它初始化為0;2.函式原型不同,calloc包括所需元素數量和每個元素的位元組數

(3)realloc

void *realloc(void *ptr, size_t new_size);

realloc用於修改乙個原先已經分配的記憶體塊大小,使用這個函式可以將一塊記憶體擴大或縮小。

如果用於擴大乙個記憶體塊,該記憶體塊原有內容保留,新增加的記憶體塊新增到原有塊的後面,若縮小乙個塊,該記憶體塊的尾部部分先被拿掉,剩餘記憶體部分原有內容保留。

若原有塊無法改變大小,則realloc將分配另一塊正確大小的記憶體,並把原有塊內容複製到新塊上。因此realloc後,不能使用指向舊記憶體的指標了,應該改用realloc返回的新指標

(4)alloca函式開闢記憶體後,不用free手動釋放

釋放記憶體

動態分配的記憶體必須整塊一起釋放,但realloc函式可以縮小一塊動態分配的記憶體,釋放和縮小是不一樣的。

void free(void *pointer),free的引數應該是malloc、calloc、realloc返回的值,或者是null,如果傳遞是的null,則不會產生任何效果。

free函式的值是指標的值,而不僅僅只是申請動態記憶體的那個識別符號,當動態開闢記憶體的指標複製之後,任一拷貝都可以將該記憶體釋放,釋放後,其他拷貝將不能訪問該記憶體。

記憶體洩漏

記憶體洩漏是指記憶體被動態分配後,當它不再使用時未被釋放,記憶體洩漏會增加程式的體積,有可能會導致程式或系統的崩潰,因為堆上的空間是有限的。

結構體指標和成員指標動態分配記憶體

結構體中有成員為指標型別,若結構體和指標成員同時開闢了記憶體,在釋放時,需要先釋放指標成員的記憶體,再釋放結構體指標,若反之,則無法釋放指標成員的記憶體,從而使程式報錯。另外,若只釋放結構體指標,並不會釋放結構體成員指標。

野指標,指向乙個刪除記憶體的但為置零的指標,或未申請記憶體區域的指標。

記憶體動態分配

陣列的元素儲存於記憶體中連續的位置上。當乙個陣列被宣告時,它所需要的內存在編譯時就被分配。但是,你也可以使用動態記憶體分配在執行時為它分配記憶體。malloc所分配的是一塊連續的記憶體。例如,如果請求它分配100個位元組的記憶體,那麼它實際分配的記憶體就是100個連續的位元組,並不會分開位於兩塊或多...

動態分配記憶體

動態記憶體分配即分配記憶體大小在執行時才確定,一般在堆中分配。c語言動態記憶體分配相關的函式。include void malloc size t size malloc的使用比較直接,乙個成功的malloc呼叫返回分配的size大小的記憶體的指標。失敗時返回null並將錯誤 置為enomem。教材...

動態分配記憶體

動態分配記憶體 動態分配記憶體也可以分配儲存區,這種方式可以在程式執行的時候臨時決定分配的儲存區大小 為了管理動態分配的記憶體,就需要使用一組標準函式 為了使用這些標準函式,需要包含stdlib.h標頭檔案 malloc 函式可以動態分配一組連續的位元組 這個函式需要乙個整數型別引數表示分配的位元組...