是,delete this;
定義了結果,只要(正如您已經注意到的)您確保對象被動態(tài)分配,并且(當然)在對象被銷毀后永遠不會嘗試使用該對象。多年來,人們一直在問許多關于標準具體內容的問題。delete this;
,而不是刪除其他指針。答案很簡短,很簡單:它什么也沒說。它只是說delete
操作數必須是一個表達式,該表達式指定指向對象或對象數組的指針。delete
(§[除刪除])沒有提到delete this;
特別是。關于毀滅的那一節(jié)確實提到delete this
在一個地方(§[class.dtor]/13):
在虛擬析構函數(包括隱式定義(15.8)的定義點上,非數組解分配函數被確定為對于表達式刪除,它出現在析構函數類的非虛擬析構函數中(參見8.3.5)。
這傾向于支持標準考慮的觀點delete this;
如果它是無效的,那么它的類型就沒有意義。這是標準提到的唯一地方delete this;
據我所知。
總之,有些人認為delete this
一次卑鄙的攻擊,并告訴任何愿意傾聽的人,這件事應該避免。一個常見的問題是很難確保類的對象只被動態(tài)地分配。其他人認為它是一個完全合理的成語,并一直使用它。就我個人而言,我處于中間位置:我很少使用它,但當它似乎是合適的工作工具時,不要猶豫。
使用這一技術的主要時間是對象,它的生命幾乎完全是自己的。JamesKanze引用的一個例子是他為一家電話公司工作的計費/跟蹤系統(tǒng)。當你開始打電話時,一些東西會注意到這一點,并創(chuàng)建一個phone_call
對象。從那時起,phone_call
對象處理電話通話的詳細信息(當您撥打電話時進行連接,在數據庫中添加一個條目以表示呼叫何時開始,如果您進行電話會議,則可能會連接更多的人,等等)。當電話中的最后一個人掛斷時,phone_call
對象完成其最后的簿記操作(例如,在數據庫中添加一個條目以說明何時掛起,以便它們可以計算調用的時間長短),然后破壞自身。的生命周期phone_call
對象基于第一個人何時開始調用,以及最后一個人何時離開調用-從系統(tǒng)其他部分的角度來看,它基本上完全是任意的,所以不能將其綁定到代碼中的任何詞法作用域,或與該順序相關的任何內容。
對于那些關心這種編碼有多可靠的人來說:如果你打電話到歐洲的任何地方,或者通過歐洲的任何地方,很有可能(至少是部分地)通過這樣做的代碼來處理它。