gpt4 book ai didi

c++ - vector 运算符[]超出范围会导致崩溃?

转载 作者:行者123 更新时间:2023-12-03 09:15:22 25 4
gpt4 key购买 nike

vector<int> iV2_func{2, 3, 4, 5};
drucke(iV2_func);
for (j=0; j<=iV2_func.size(); j++) {
iV2_func[j] = quadfunc(iV2_func[j]+1);
}
drucke(iV2_func);

我目前正在为即将到来的C++考试做练习,并且由于我从Java成长而来,所以我并不熟悉C++的所有习俗。
给定的代码在 main() -Method中,所有必需的东西都已包括在内。
任务是检测六个for循环中的错误,这些循环使用不同的方法将参数与其自身相乘,例如宏,模板,内联函数等。 drucke()打印 vector 的单个成员。
这里的for循环显然是超出范围的,但是由于未使用 .at() -Method,因此不会引发异常,相反,我们最终会出现未定义的行为。

当我启动程序时,打印完所有行后程序崩溃。即使在此for循环之后的for循环也正在运行,并且所有内容都被打印出来。似乎该错误发生在main()方法的末尾,而不是在程序访问超出范围的索引时发生,但是错误肯定在该索引中,因为程序不会因此崩溃。那么,该程序似乎可以使用该代码,但最终还是崩溃了呢?

最佳答案

So how exactly is it that the program seems to work with that code but still crashes at the end?



您很可能已经在调试构建配置中编译了程序。在调试版本中,分配的内存区域的“边界”通常填充有金丝雀值,以便在内存释放后可以检测到OOB写操作。当检测到这样的死金丝雀时,内存解除分配器将中止程序。

为什么需要金丝雀值?因为在现代操作系统上,内存分配和保护仅以页面粒度(通常为4k)进行。因此,只要您的内存访问处于操作系统提供的映射的范围内(这是页面大小的倍数),操作系统就无法检测到非法访问。但是,内存分配器将在那些页面内池化分配,并且由于在该区域内的对象之间没有保护,因此很难检测到破坏“邻居”的OOB访问。因此,金丝雀值,以便在开发中可以报告这种OOB访问。

关于c++ - vector 运算符[]超出范围会导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32200660/

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