2013-03-08 208 views
-2

比方說,我們有超過分配給堆空間內存指針列表的迭代器(ITER),如果我這樣做C++運算符優先級

delete (*iter++) 

我是正確的優先級是第一個提領迭代器取得內存地址然後釋放空間,然後增加迭代器釋放下一個元素?

+0

不要編寫需要太多的代碼,但要弄清楚發生了什麼 - 最好將其分散到幾行。這樣你可以防止現在或將來的錯誤。 – 2013-03-08 13:47:34

+0

爲了確保我能理解幕後發生的事情...... – user1845360 2013-03-08 13:56:30

回答

3

的效果是你寫的,但它使用一個稍微不同的順序來實現:

  1. 的後遞增具有最高的優先級,所以它的第一評價。但是,其返回值(由其他運營商處理)的值爲iter之前的的增量。

  2. 下一步評估解除引用,返回iter未增加的值「指向」的指針。

  3. delete最後被評估,指針被刪除。

4

雖然++ has higher precedence than *,後期增量++的副作用後應用的引用操作*採用了迭代器的值。這是後增量行爲,或後綴++(與預增量相反,或前綴++)。這條規則適用於迭代器以及「普通」指針。

0

該生產線是相同的:

delete (*(iter++)) 

但由於後綴增量返回原來的價值,你還在提領的iter原始值。因此,如果iter指向指向動態分配對象的指針,則delete將銷燬該對象。然後iter會一直指向下一個指針。

1

優先實際上是反向,並且如果所述迭代器類型(帶重載操作符)的,這是調用給操作者功能的順序:

  • 遞增運算符是調用增加迭代器。它返回本身的副本之前的增量。
  • 在臨時迭代器上調用解引用運算符,並返回iter用於調用的列表項的值。
  • 剛剛返回的指針被刪除,即指向的對象被破壞,然後釋放內存。