::(可選) 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]
;
兩者的區別在於帶
的new
和delete
會對每個元素呼叫建構函式和習慣函式
不能刪除指向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 ...