在c++中我們知道函式可以進行過載,而一些操作符也是可以過載的。比如new和delete操作符。
我們知道new和delete是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;
過載後的new和delete
//針對單個物件
void
* operator new
(size_t sz)
void operator delete
(void
* ptr)
指標 pt 指向的是未過載的new建立出的物件,pt1 是指向過載後的 new 即(operator new)建立出的物件。兩者有什麼區別呢。
其實 new 的底層會呼叫 operator new 先為物件申請空間,然後呼叫類的建構函式對物件進行初始化。這也就是為什麼 new 可以為變數進行初始化而 malloc 不可以。
所以 new 申請空間時會:
1.申請空間同樣的是, delete 底層也會先呼叫析構函式清理物件,然後才釋放空間。2.呼叫建構函式初始化
所以 delete會:
1.呼叫析構函式注意注意:new 和 delete 做的事情順序不能搞亂,new 先申請空間再呼叫建構函式,而 delete 是先呼叫析構函式再釋放空間。2.釋放空間
而且還要注意的是:過載後的new和delete只負責申請和釋放空間,不會呼叫建構函式和析構函式二、針對於陣列物件new 和 delete 的過載即(operator new 和 operator delete)有兩個特殊點:
1.返回值必須是 void *
2.引數型別必須是size_t
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...