C C 程式設計 delete 表示式

2021-10-22 10:28:50 字數 2988 閱讀 9891

::(可選) delete 表示式(1)

::(可選) delete 表示式(2)

銷毀 new 表示式建立的單個非陣列物件

銷毀 new 表示式建立的陣列

對於第一種(非陣列)形式:

值 必須是如下三種情況之一:

若 表示式 為其他值,包括它是通過new 表示式的陣列形式獲得的指標的情況,其行為未定義。

對於第二種(陣列)形式,

若 表示式 為其他值,包括若它是由 new 表示式的非陣列形式獲得的指標的情況,其行為未定義。

表示式的結果始終具有 void 型別。

也就是說:呼叫new申請的記憶體用delete釋放;呼叫new申請的記憶體就一定要用delete釋放。

我們來看個例子:

class

test

;

test* ptest =

new test;

delete ptest;
test* ptests =

new test[10]

;

兩者的區別在於帶newdelete會對每個元素呼叫建構函式和習慣函式

不能刪除指向void的指標,因為它不是指向完整物件型別的指標。

// delete (); // 解析錯誤

delete([

])()

;// ok

據說初期的c++在呼叫delete時是需要指定元素個數的,但是那樣會非常麻煩。所以後來進行了改進:在實現new的時候同時申請記憶體空間儲存元素的個數。基本上是這個樣子:

struct array 

;

在呼叫new時先通過malloc申請記憶體多申請一點空間儲存count_of_test,然後是返回給使用者t空間的例子。這個位址要在malloc獲得的array位址上加乙個偏移量。最後對這個t空間呼叫每個元素的建構函式。

呼叫delete的引數實際上是t空間的位址。先對這個位址引數進行減偏移量運算得到array位址並取得count_of_test,然後對t空間呼叫析構函式count_of_test次。最後以array位址作為引數呼叫free()函式。

除了正確呼叫建構函式/析構函式以外,還要處理儲存元素個數的空間。

所以必須配對使用。

為了避免記憶體洩漏,每個動態記憶體分配必須與乙個等同相反的deallocation對應。函式operator delete與delete操作符的關係與operator new與new操作符的關係一樣。當:

string *ps;..

...delete ps;

operator delete呼叫:

void

operator

delete

(void

*memorytobedeallocated)

;

導致編譯器生成(編譯器會生成**來析構物件並釋放物件的記憶體。):

ps-

>

~string()

;operator

delete

(ps)

;

這又乙個隱含的意思,如果你只想處理未被初始化的記憶體,你應該繞過new和delete操作符,而呼叫operator new獲得記憶體和operator delete釋放記憶體給系統:

void

*buffer =

operator

new(50*

size

(char))

;//分配足夠的記憶體以容納50個char,沒有呼叫建構函式..

.operator

delete

(buffer)

;//釋放記憶體,沒有呼叫析構函式

這與c中呼叫malloc和free等同。

如果你用placement new在記憶體中建立物件,你應該避免在該記憶體中用delete操作符。因為delete操作符呼叫operator delete來釋放記憶體,但是包含物件的記憶體最初不是使用operator new分配的,placement new只是返回傳遞給它的指標。你應該顯式呼叫物件的析構函式來解除建構函式的影響:

class

widget

;widget *

constructwidgetinbuffer

(void

*buffer,

int widgetsize)

// 在共享記憶體中分配和釋放記憶體的函式

void

*mallocshared

(size_t size)

;void

freeshared

(void

*memory)

;void

*sharedmemory =

mallocshared

(sizeof

(widget));

widget *pw =

constructwidgetinbuffer

(sharedmemory ,10)

;//...

//delete pw; //結果不確定!共享記憶體來自mallocshared,不是operator new

pw->

~widget()

://正確,析構pw指向的widget,但是不釋放包含widget的記憶體

freeshared

(pw)

;//正確,釋放pw指向的共享記憶體但是沒有呼叫析構函式

new和delete表示式

1.系統為每個程式都提供了乙個在程式執行時可用的記憶體池.這個可用記憶體池被稱為程式的空閒儲存區 free store 或堆 heap 執行時刻的記憶體分配被稱為動態記憶體分配 dynamic memory allocation new表示式返回指向新分配的物件的指標.int pi new int ...

C C 條件表示式

c c 條件表示式使用三目運算子 完成,適當條件下可與 if else 語句相互替換。條件表示式優點在於可直接返回表示式運算的結果。條件表示式的使用分為三個部分,示例如下 c a b 其中 c 為判斷條件,a,b 可為具體的值或是算式。表示式先對 c 進行判斷,若 c 的判斷結果不為 0 或 tru...

C 的new和delete表示式

定義變數時,必須指定其資料型別和名字,而建立動態物件時只需要指定其資料型別,而不必為該物件命名 int i int pi new int 這個new表示式在自由儲存區中分配建立了乙個整形物件,並返回次兌現光額位址,並用改位址初始化pi 1.動態建立的物件可以用初始化變數的方式實現初始化 int i ...