C 記憶體管理new和operator new

2021-10-11 03:21:58 字數 2652 閱讀 8036

在c++中我們知道函式可以進行過載,而一些操作符也是可以過載的。比如newdelete操作符。

我們知道newdelete是c++中負責申請記憶體空間釋放空間的。針對與系統內建型別的變數的使用和操作就不過多介紹。今天看看針對於某個物件的使用。

先給出乙個簡單的test類:

class test

~test()

private:

int m_data;

};

new的過載有兩種情況:1.針對於單個物件。2.針對於陣列物件。

一、針對於單個物件

先new出乙個物件:

test* pt = new test;

//new 操作符(運算子) 1.申請空間 2.構造物件

test* pt1 =

(test*

)operator new

(sizeof

(test));

//相當於malloc 只負責申請空間

delete pt;

//先呼叫析構函式,再呼叫operator delete

delete pt1;

過載後的newdelete

//針對單個物件

void

* operator new

(size_t sz)

void operator delete

(void

* ptr)

指標 pt 指向的是未過載的new建立出的物件,pt1 是指向過載後的 new 即(operator new)建立出的物件。兩者有什麼區別呢。

其實 new 的底層會呼叫 operator new 先為物件申請空間,然後呼叫類的建構函式對物件進行初始化。這也就是為什麼 new 可以為變數進行初始化而 malloc 不可以。

所以 new 申請空間時會:

1.申請空間

2.呼叫建構函式初始化

同樣的是, delete 底層也會先呼叫析構函式清理物件,然後才釋放空間。

所以 delete會:

1.呼叫析構函式

2.釋放空間

注意注意:new 和 delete 做的事情順序不能搞亂,new 先申請空間再呼叫建構函式,而 delete 是先呼叫析構函式再釋放空間。

而且還要注意的是:

new 和 delete 的過載即(operator new 和 operator delete)有兩個特殊點:

1.返回值必須是 void *

2.引數型別必須是size_t

過載後的new和delete只負責申請和釋放空間,不會呼叫建構函式和析構函式二、針對於陣列物件

test* pt2 =

new test[10]

;delete

pt2;

如上**,申請乙個陣列物件時,operator new 如下:

void

*operator

new[

](size_t sz)

void

operator

delete

(void

* ptr)

除了注意與普通物件的過載的區別外。在除錯的時候,我們更應該注意的是,對於10個大小為 int 的空間,本應申請 4*10 個位元組大小的空間,但是operator new[ ] 卻申請了 44 個位元組空間。

在 operator new[ ] 申請空間時, ptr 的位址是 0x007e60d8,而返回的 pt2 剛好比 ptr 的位址多了 4 個位元組(0x007e60dc),上面的4 個位元組是不給使用者使用的。

這是為什麼呢?見下**釋:

在最後 delete [ ] pt2 時,因為我們釋放的是 pt2(0x007e60dc)的位址,而 ptr(0x007e60dc)比 pt2 多4個位元組,會不會引起4個位元組的記憶體洩露呢,答案是不會的。編譯器在底層是會調整的。

注意:但是要想實現這樣的情況,類中必須要有析構函式

最後,既然 new 既然這麼好用我們為什麼還要說它的過載呢,我們要了解過載和不過載的區別:new 除了申請空間外還會呼叫建構函式進行初始化,但當我們需要申請空間的物件特別複雜並且不需要初始化時,new 呼叫建構函式會浪費時間,所以我們會對 new 進行過載,只負責申請空間。delete 也如此。

記憶體管理 new

作用域 作用的範圍 a.普通區域性變數 include intmain int argc,char ar 內部定義的變數就是區域性變數 只有執行到定義變數的這個語句,系統才會給這個變數分配空間 當離開 這個非static區域性自動釋放 區域性變數的作用域在當前的 離開此 無法使用此變數 的普通區域性...

C 動態記憶體管理 new和delete

c 中使用new 分配 和delete 釋放 來管理在堆 也叫自由空間 的記憶體 它們的底層封裝了c語言中的malloc和free函式 new和delete malloc必須配套使用,不能交叉使用,原因 如果用free釋放 new建立的動態物件 那麼該物件因無法執行析構函式而可能導致程式出錯。如果用...

C C 記憶體管理 new和delete

c 語言中的動態記憶體管理方式有malloc calloc realloc 和 free,但是 malloc 和 free 是函式,new 和 delete 是 c 用於管理堆記憶體的兩個運算子 1.內建型別操作void test1 動態申請10個int型別的空間。並初始化為 delete p1 d...