簡體   English   中英

3D矢量索引不一致C ++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM