我在玩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 ++的主要理念是程序员永远不会犯此类错误;-)