C C 中基本的記憶體管理工具

2021-10-05 05:13:18 字數 2929 閱讀 4282

對於new/delete,new/delete,他們均為c++的運算子。

他們的使用:

string *sp = new string;//單個物件

string *arr = new string[10];//10個物件

delete sp;

delete arr;

當我們使用乙個new表示式時,他實際上執行了三個步驟:

1. new 表示式呼叫乙個operator new(operator new)的標準庫函式,請求分配一塊記憶體空間。

2. 將分配的空間(void * )轉為對應的物件指標。

3. 編譯器執行相應的建構函式以構造這些物件,並為其傳入初始值。

而當我們使用一條delete 表示式刪除乙個物件時,它背後實際上執行了兩步操作:

1. 呼叫物件對應的析構函式

2. 呼叫名為operator delete(或者 operator delete)的標準庫函式釋放記憶體空間。

測試**:

\\測試**

#include using namespace std;

class complex

其中place_address必須是乙個指標,同時在initializers中提供乙個(可能為空的)以逗號分隔的初始值列表,該初始值列表將用於構造新分配的物件。(這個new不分配空間)

當我們使用乙個**placement new(定位new)*時,定位new使用operator new(size_t,void)"分配"它的記憶體。這是乙個我們無法自定義的operator new版本。該函式不分配任何記憶體,它只是簡單的返回指標實參;然後由new表示式負責在指定的位址初始化物件以完成整個工作。定位new允許我們在乙個特定的,預先分配的記憶體位址上構造物件。

使用例項:

void* ptr = malloc(sizeof(complex));

complex* ptr1 = new(ptr)complex(2,3);

void* ptr2 = malloc(sizeof(complex)*5);

void* ptr3 = new(ptr2)complex[5],3};

free(ptr);

free(ptr2);

測試**:

在候捷老師記憶體管理的課程中有圖如下:展示了new表示式背後的工作,分配記憶體,型別轉換,呼叫建構函式(只有編譯器能直接呼叫ctor,建構函式),我們可以利用placement new間接呼叫ctor。以及在vc98中,operator new的實現細節,通過呼叫(crt,c runtime libary),malloc來分配空間。

下圖展示了delete表示式背後的工作,呼叫析構函式,呼叫operator delete(實際上通過呼叫free(),c函式)來釋放空間。

note:對於malloc分配的空間,可以通過placement new來呼叫建構函式,初始化物件。析構函式是可以直接被呼叫的

動態記憶體管理數

函式說明

void* malloc (size_t size);

分配一塊大小為size位元組的記憶體塊,並返回乙個指向該塊開頭的指標。新分配的記憶體塊的內容未初始化,值不確定。如果size為零,則返回值取決於特定的庫實現(它可以是null指標,也可以不是null指標),但是不應取消對返回的指標的引用。

void free (void* ptr);

釋放由malloc/calloc/realloc分配的記憶體塊,使得這個記憶體塊能再一次的被分配。如果ptr指向的是不是以上函式分配的記憶體塊,那麼會導致不確定的行為。ptr為空,則這個函式不做任何事。這個函式不會改變ptr的值,因此ptr仍然指向之前分配的記憶體。

void* calloc (size_t num,size_t size);

為元素大小為size,含有num個元素的陣列分配記憶體空間,並且把這個空間的所有位(bits)置為0。

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

重新分配記憶體塊。更改ptr指向的記憶體塊的大小。該函式可以將記憶體塊移動到新的位置(其位址由該函式返回)。即使將儲存塊移動到新位置,該記憶體塊的內容也會保留到新舊大小中的較小者。如果新大小較大,則新分配部分的值不確定。如果ptr是空指標,則該函式的行為類似於malloc。

測試**:

#include #include "stdlib.h"

using namespace std;

int main(){

int num = 10;

int *ptr = (int*)calloc(num,sizeof(int));

for (size_t i = 0; i < num; i++)

{cout<1. c++記憶體管理,候捷,博覽網課程

2. c++ reference

Valgrind記憶體管理工具

記憶體管理是軟體開發中最為重要的環境,如果乙個長期執行的程式,即使其中的某個函式每一次洩露1kb的記憶體空間,該函式每1分鐘呼叫100次,100天後,將產生60 24 10 1kb 1.44gb的記憶體空間,對於一般系統來說,其實早已處於宕機的狀態。如何能夠檢視這種記憶體洩露呢,可以使 用valgr...

python基本庫管理工具

多選題 脊柱生理彎曲包括 填空題 x 3.1415926 print 6.2f x 結果為 空格用減號 表示 單選題 下面 輸出是哪一項?class change def init self,x,y,z self.a x y z x change 1,2,3 print x.a 單選題 下面 輸出是...

IT專案管理工具

一 完善的專案管理工具,需要具有如下的管理模組 1.需求管理 專案的需求變更,跟蹤,控制 2.資源管理 專案的可利用的資源 人力,物力,財力 3.計畫管理 包括成員管理和許可權分配,日程排定,工作時間管理,里程碑設定 4.進度管理 日曆,工作流,專案路線圖和gantt圖 5.測試管理 專案軟體缺陷b...