前幾天,我在常逛的論壇上看到有人這樣寫 C++ 的 delete:

delete p1, p2, p3;

 

上例在C++當中百分之百合法。我不知道這樣寫的人多不多,或是其他的語言有沒有類似的語法,不過只要有點基本 sense 就應該立即察覺在C++這樣寫大有問題。要抓出這個語病不需要是個C++律師,只要知道下面兩點:

1. C++ 中的 delete 是個 operator
2. 逗號也是個 operator,而且優先順序非常低。(事實上是所有的operator當中最低的,不過我們不需要知道這點)

按照運算子優先順序delete遠高於逗號,所以上面的程式相當於

(delete p1), (p2), (p3);

 

只有p1會被delete,而 p2 和 p3 若沒有其他安排(我想當然不會有),就會發生 memory leak。

 


 

然後我想到另一個似是而非的寫法:

delete(p1, p2, p3);

 

故意寫得有點函數的味道,當然這也是完全合語法的C++陳述。不過事實上delete根本就不是函數,我們只是另外運用了括號改變運算順序,變成先做完逗號運算之後,再把delete套用到逗號運算傳回的結果上。

那麼結果是甚麼呢?預設的逗號operator會傳回右方的運算值,所以只有 p3 會被delete,而 p1 和 p2 都會 leak。不過由於逗號可以 overload,所以是有可能讓上面的寫法連續解構三個物件,只是有點複雜就是了,還不如乖乖寫成三行delete。

arrow
arrow
    全站熱搜

    novus 發表在 痞客邦 留言(1) 人氣()