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

时间:2013-07-15 19:42:51

标签: c++ macos stdvector

我正在使用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

1 个答案:

答案 0 :(得分:3)

如果您在使用operator[]访问边界外的向量时遇到运行时错误,那么您的期望是错误的。

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

在C ++中,出于性能原因,运行时错误天使很少(即检查你在运行时没有做错),除非你特别要求它们(例如使用std::vector::at()而不是{{1除非你自己实现它们,否则不会进行检查,无论发生什么事情都会发生。

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

墨菲说如果你在潜在的投资者和家人面前展示你的软件,你只会遇到崩溃。在那之前,即使你覆盖了不属于你的记忆,一切看起来都会完美。

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