2016-02-05 21 views
1

我遇到這個術語異常安全的容器。我想了解究竟什麼是異常安全的意思? 對於不同的容器是否有任何比較?在C++中的容器的異常安全

+0

https://en.wikipedia.org/wiki/Exception_safety –

+1

有很多關於異常安全的資源。通常我們談論[*安全級別](https://en.wikipedia.org/wiki/Exception_safety)。高級專家如[Herb Sutter](http://www.gotw.ca/gotw/059.htm)已經寫了關於如何實現這一點的文章。 – BoBTFish

+0

我瞭解現在的異常安全及其三種規範形式。但是,容器的異常安全是什麼意思?這是否意味着即使容器可以拋出異常? – Barry

回答

1

如果您查看各種數據結構的算法,可以看到它們涉及一系列步驟。數據結構在步驟開始時和結束時具有一些完整性(一致的內部含義)。

例如,考慮vector,其涉及dynamically growing array。這通常涉及一個數組,一個描述數組大小的整數,以及一個描述已使用元素數量的整數。插入一個元素時,可能會分配一個兩倍大小的新數組,複製到新元素的元素,描述大小的整數將乘以2,描述已使用元素數的整數將增加1,等等

此時引發的異常(例如,通過元素的複製構造函數)可能會導致中間的步驟序列被終止。例如,如果你不小心首先更新整數,那麼只有在分配和複製(並且不捕獲異常)時,數據結構纔會失去內部一致性。

對於STL容器,異常安全的含義是,它們保證這種終止將使數據結構保持一致的狀態。

+0

是否有任何STL容器是異常安全的? – Barry

+0

是的。基本上,它們各自保證某種形式的例外安全。你應該將你的類設計得很好(例如,不要在析構函數中拋出),並且可以通過支持移動語義來改進。請查閱單個容器文檔以獲取其保證。 –

+0

由scott meyers編寫的有效C++是本書的開始....幾乎所有的容器都按照C++規範提供了一些嚴格的異常安全性。 – basav