2013-05-18 73 views
10

我有一個std::vector。我檢查它的大小是6,但是當我嘗試訪問vec[6]來檢查它是否會給出錯誤時,我不會收到任何錯誤,但會得到一些數字。它不應該給出一個錯誤?矢量超出範圍而不給出錯誤

編輯:是這樣的:

struct Element 
{ 
    std::vector<double> face; 
}; 

int main() 
{ 
    Element elm; 

    .... // insert 6 elements into elm.face 

    std::cout << elm.face.size() << std::endl; // answer is 6 
    std::cout << elm.face[6] << std::endl; // answer is some number 
} 
+1

大小爲6,所以最後是'VEC [5]'0 – Bill

+1

不知道從哪裏開始你得到的想法,'VECTOR'將在一個無效的指數使用'操作符[]'拋出一個錯誤。文檔肯定會另有說明。 –

+0

'注意,第一個元素是0(不是1).'的位置 - http://www.cplusplus.com/reference/vector/vector/operator[]/ – Bill

回答

27

STL向量在調用.at()成員函數時執行邊界檢查,但是do not perform any checks on the [] operator

當超出範圍時,[]運算符產生未定義的結果。

+7

行爲是未定義的,所以實現**允許**引入邊界檢查;與'at'的不同之處在於,對於'at',邊界檢查是**必需的**。 –

3

這是不確定的行爲。未定義的行爲並不一定意味着你會得到一個錯誤:你可能會,但你可能會得到一些沒有多大意義的結果。

-1

數據結構索引從0開始,所以如果你正在訪問vec [6],那麼這將是越界。由於內存問題,您可能不會收到錯誤;從之前運行的代碼或類似的錯誤中可能會出現一些問題。請張貼代碼。

7

正如kgraney的回答所述,這是未定義的行爲。但是,大多數C++庫有一些中止的機制,或者在這種情況下引發異常。通常通過設置或取消設置特定的編譯器宏來控制。

我已經取得了相關文檔的概述:

GNU的libstdC++

鐺libcxx

升壓

微軟

需要注意的是GNU和鐺默認情況下禁用的檢查,而微軟則它們默認情況下啓用。如果您不知道這一點,則在微軟系統上的調試模式下,您的代碼可能運行速度會明顯變慢。

+0

...在調試模式下*在微軟系統上可能運行速度明顯較慢。 – legalize