2012-12-15 123 views
5

我正在閱讀一些關於STL的文檔,並且在那裏寫道end()函數返回容器最後一個元素旁邊的字節的迭代器。STL迭代器:container.end()

我想知道如果容器佔用整個可用內存的最後幾個字節會怎麼樣。那麼會發生什麼?

+0

指針是一種迭代器,而不是其他方式。 –

+0

@BenjaminLindley你能告訴我爲什麼這樣嗎?我是一個初學者... – Kolyunya

+0

我只是挑剔。我得到的是有很多類型的迭代器,而不僅僅是指針。所以「迭代器是指針」並非如此。 *一些*迭代器是指針,有些則不是。現在相反,「指針是迭代器」,這是真的,或者至少,這就是我的意思。然而,事實並非如此。有些指針不是迭代器,有些僅用作參考類型。所以我錯了。 –

回答

4

C++內存模型保證您始終可以在數組的最後一個元素之後形成指向元素的指針。如果沒有,系統不會讓你在這個位置分配一個對象,或者它會環繞。另外,請注意,這是數組的潛在問題,因爲其他容器可以使用迭代器類型,它以其他適當形式處理過去的結束位置:它們完全控制增量操作的工作方式。

+0

這是否意味着我不會讓一個數組佔據整個可用的內存,對嗎?至少必須剩下一個字節?我能理解嗎? – Kolyunya

+0

@Kolyunya:C++的設計並不妨礙它,但大多數操作系統仍然不會允許它。 –

+1

@Kolyunya:假設您正在使用16位嵌入式系統,並且您在位置0xFFFE處創建了一個具有16位整數的數組。添加一個整數(2個字節),並將其包裝爲0x0000。如果你做一個迭代器的簡單比較,它們都是0和i == end()。一切都很好。 –

3

一個結束迭代器(至少象徵性地)指向,過去結束了容器。容器中的有效物品從*container.begin()*container.end()-1

換句話說,你可以將某些其他迭代比較結束迭代,看是否they'r等於(它告訴你,你已經達到了容器項目的結束),但你可以取消引用結束迭代器(即,您不得嘗試訪問它引用的項目)。

編輯:對不起,有人誤解了這個問題:好吧,如果容器實際上使用了內存的最後一個字節(罕見/不太可能,但理論上可能),你通常會看到地址環繞內存的開始,當然,假設它是一個迭代器,它在地址方面確實起作用。在這種情況下,您通常會將其轉換爲0地址,該地址仍可與任何有效地址區分開來(即0將轉換爲空指針,該指針不能爲有效指針)。

但是,在一個典型的情況下,這種事情很可能不會發生。例如,在大多數32位系統上,用戶被限制爲使用前2或3千兆字節的地址空間,並且高地址是爲操作系統保留的。

+0

問題是,如果沒有更多的內存地址,會發生什麼情況。所以迭代器指向的物理存在的內存。 – Mosby

+0

如果最後一個元素指向內存中的最後一個字節,該怎麼辦?那麼.end()會指向(至少比喻性地)呢? – Borgleader

+0

@Borgleader:沒什麼,但沒關係。 – rici