對於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...