繁体   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