0

我在玩 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 上开发

4

1 回答 1

3

如果您在访问边界外的向量时预计会出现运行时错误,operator[]那么您的期望是错误的。

当您犯这种错误时,C++ 标准会说这是“未定义的行为”,而不是“运行时错误”。

在 C++ 中,出于性能原因,很少有运行时错误天使(即检查您在运行时没有做错什么)所以除非您特别要求它们(例如使用std::vector::at()而不是std::vector::operator[])或者除非您自己实现它们,否则不会检查完成,无论发生什么。

有时,当你犯了这种错误时,你会立即崩溃,但这只有在你非常幸运的时候才会发生。在最常见的情况下,您最终会破坏属于某个其他对象或运行时库的数据,并且稍后执行一百万条指令,程序中完全无辜的部分开始表现得像疯了一样。

Murphy 说,只有在潜在投资者和您的家人面前演示您的软件时,您才会遇到崩溃。在那之前,即使您覆盖了不属于您的内存,一切似乎都可以正常工作。

C++ 的主要理念是程序员永远不会犯这种错误 ;-)

于 2013-07-15T19:57:05.050 回答