超出范围的向量运算符[]导致崩溃
Vector operator [ ] out of range leads to a crash?
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()
-方法,一切必要的已包括等。任务是检测六个for循环中的错误,这些循环使用不同的方法将参数与自身相乘,例如宏、模板、内联函数等。drucke()
输出vector的单个成员。这里的for循环显然是越界的,但是由于没有使用.at()
-Method,因此不会抛出异常,相反,我们最终会有未定义的行为。
当我启动程序时,程序崩溃在所有行都打印出来之后。甚至在之后的for循环这个for循环也被执行了,所有的东西都被打印出来了。似乎错误发生在main()方法的末尾,而不是当程序访问超出范围的索引时,但错误肯定在于该索引,因为程序不会崩溃。那么,究竟是怎么回事,程序似乎与这些代码一起工作,但最后仍然崩溃?
那么,究竟是怎么回事,程序似乎与这些代码一起工作,但最后仍然崩溃?
很可能您已经在调试构建配置中编译了程序。在调试构建中,分配的内存区域的"边界"通常用金丝雀值填充,以便在内存释放时可以检测到OOB写。当检测到这种被杀死的金丝雀时,内存释放程序将中止程序。
为什么需要金丝雀值?因为在现代操作系统上,内存分配和保护只发生在页面粒度上,通常是4k。因此,只要您的内存访问保持在操作系统提供的映射范围内(这是页面大小的倍数),操作系统就无法检测到非法访问。然而,内存分配器将在这些页内汇集分配,并且由于在这样一个区域内的对象之间没有保护,因此很难检测到破坏"邻居"的OOB访问。因此,金丝雀值,以便在开发中可以报告这样的OOB访问。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 赋值运算符在我制作类模板时使代码崩溃
- 运算符重载 new 时 void * nullptr 使程序崩溃
- 具有重载类型转换运算符的函数对象崩溃
- 带有运算符的简单用户定义类 = 重载代码崩溃
- 崩溃时间(运算符 new(无符号 int)+22)
- 矢量未正确擦除内容(复制分配运算符的量运行直到崩溃 [BEX])
- C++ 程序在使用 -> 运算符后崩溃
- 为什么使用static_cast运算符的不安全强制转换不会崩溃
- 类成员作为对另一个的引用:赋值运算符中的崩溃
- 如果比较函数不是运算符<,为什么std::sort会崩溃;
- 赋值运算符在 xcode 4 中崩溃,在MSVS2010中运行良好
- C++中重载运算符编译但崩溃
- C++ 随机 COUT 语句导致程序在重载的"="运算符内崩溃
- 超出范围的向量运算符[]导致崩溃
- Android NDK 在使用 STL Map 的运算符时崩溃 []