gpt4 book ai didi

c++ - 3D vector 索引不一致 C++

转载 作者:行者123 更新时间:2023-11-28 00:43:21 24 4
gpt4 key购买 nike

我在 C++ 中研究 vector 的 vector 。在我的例子中,我称之为 3D vector 的代码显示在以下代码中

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;
}

代码本身就说明了问题,当访问第一个和第二个索引的 vector 边界之外时,我得到了预期的运行时错误,但是当对第三个索引执行相同的操作时,它没有发生,没有错误,什么都没有根本。我什至尝试过在第三个索引中使用大数字,但显然一切都运行良好。我错过了什么或这段代码发生了什么?

我在 Mac OS X 10.8.4 + Xcode 4.6.3 上开发

最佳答案

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

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

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

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

墨菲说,如果您在潜在投资者和您的家人面前演示您的软件,您只会遇到崩溃。在那之前,即使您覆盖了不属于您的内存,一切似乎都能完美运行。

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

关于c++ - 3D vector 索引不一致 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17662496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com