为了账号安全,请及时绑定邮箱和手机立即绑定

矢量越界而不给出错误

矢量越界而不给出错误

C++
翻阅古今 2019-11-04 09:56:57
我有一个std::vector。我检查它的大小是6,但是当我尝试访问vec[6]它是否会给出错误时,我没有看到任何错误,但是得到了一些数字。它不应该给出错误吗?编辑:类似:struct Element{    std::vector<double> face;};int main(){    Element elm;    .... // insert 6 elements into elm.face    std::cout << elm.face.size() << std::endl; // answer is 6    std::cout << elm.face[6] << std::endl; // answer is some number}
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

如kgraney的回答所述,这是不确定的行为。但是,大多数c ++库在某些情况下具有中止或引发异常的功能。通常通过设置或取消设置特定的编译器宏来控制。


我已经对相关文档进行了概述:


gnu libstdc ++

调试模式 -有关libstdc ++调试的常规信息

_GLIBCXX_DEBUG

带有-fconcepts的_GLIBCXX_CONCEPT_CHECKS-启用c ++概念

langlibcxx

_LIBCPP_DEBUG_LEVEL = 1

促进

BOOST_DISABLE_ASSERTS-禁用Boost库中的断言

微软

选中的迭代器

_ITERATOR_DEBUG_LEVEL-设置迭代器调试级别

CRT中的安全功能

_CRT_SECURE_NO_WARNINGS:禁用弃用警告

_SCL_SECURE_NO_WARNINGS-安全性较低(根据Microsoft),但更符合标准:


_SECURE_SCL-设置迭代器调试级别的旧方法


_HAS_ITERATOR_DEBUGGING-已弃用的宏

请注意,默认情况下,gnu和clang禁用检查,而Microsoft默认情况下将其启用。如果您不知道这一点,您的代码在Microsoft系统上的调试模式下运行可能会明显变慢。


查看完整回答
反对 回复 2019-11-04
?
森栏

TA贡献1810条经验 获得超5个赞

这是未定义的行为。未定义的行为并不一定意味着您会得到一个错误:您可能会错,但您可能会得到一些没有太大意义的结果。


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 365 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信