[英]3D vector indices inconsistency C++
我在玩C ++中的向量向量。 在我的情況下,以下代碼顯示了我所謂的3D矢量
typedef std::vector<double> RandomSample;
typedef std::vector<RandomSample> TimeSample;
typedef std::vector<TimeSample> Option;
int main(int argc, const char * argv[])
{
unsigned int numberOfOptions = 3;
unsigned int timeNodes = 7;
unsigned int numberOfRandSamples = 10;
Option options(3, TimeSample(7, RandomSample(numberOfRandSamples)));
std::cout << options[0][0][0] << std::endl;
//std::cout << options[3][6][9] << std::endl; //SEGMENTATION FAULT
//std::cout << options[2][7][9] << std::endl; //SEGMENTATION FAULT
std::cout << options[2][6][20] << std::endl; //NO ERROR !!
std::cout << "Hola Mundo !" << std::endl;
return 0;
}
該代碼本身說出了問題,當訪問超出第一和第二個索引的向量范圍時,我會得到預期的運行時錯誤,但是當對第三個索引執行相同操作時,則不會發生,沒有錯誤,一點也沒有。 我什至嘗試在第三個索引中使用較大的數字,但顯然一切正常。 我缺少什么或這段代碼是怎么回事?
我正在Mac OS X 10.8.4 + Xcode 4.6.3上開發
如果您在使用operator[]
超出范圍訪問向量時遇到運行時錯誤,則您的期望是錯誤的。
當您犯此類錯誤時,C ++標准會說這是“未定義的行為”,而不是“運行時錯誤”。
在C ++中,出於性能原因,幾乎沒有運行時錯誤天使(即檢查您在運行時沒有做錯什么),因此除非您特別要求它們(例如,使用std::vector::at()
代替std::vector::operator[]
)或除非您自己實現它們,否則將不會進行檢查並且無論發生什么情況。
有時,當您犯此類錯誤時,您會立即崩潰,但這僅在您非常幸運時才會發生。 相反,在大多數情況下,您最終會破壞屬於某個其他對象或運行時庫的數據,並在稍后執行一百萬條指令時,程序中完全無辜的部分開始表現得異常瘋狂。
Murphy說,只有在潛在投資者和家人面前展示您的軟件時,您才會崩潰。 在那之前,即使您覆蓋了不是您自己的內存,所有東西似乎都可以正常工作。
C ++的主要理念是程序員永遠不會犯此類錯誤;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.