我正在使用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
答案 0 :(得分:3)
如果您在使用operator[]
访问边界外的向量时遇到运行时错误,那么您的期望是错误的。
当你犯这种错误时,C ++标准说它是“未定义的行为”,而不是“运行时错误”。
在C ++中,出于性能原因,运行时错误天使很少(即检查你在运行时没有做错),除非你特别要求它们(例如使用std::vector::at()
而不是{{1除非你自己实现它们,否则不会进行检查,无论发生什么事情都会发生。
有时候当你犯这种错误时会立即崩溃,但只有当你非常幸运时才会发生这种情况。在大多数常见情况下,您最终会破坏属于某个其他对象或运行时库的数据,以及随后执行的一百万条指令,程序中完全无辜的部分开始表现得像疯了一样。
墨菲说如果你在潜在的投资者和家人面前展示你的软件,你只会遇到崩溃。在那之前,即使你覆盖了不属于你的记忆,一切看起来都会完美。
C ++的主要哲学是程序员永远不会犯这种错误; - )