c++ - 该 vector 的大小为 2,但它在索引 100 中仍有一个值

标签 c++ c++11

我在 http://cpp.sh/ 中运行以下代码. 输出显示 name1.size()=2,但 name1[100]=10;

// Example program
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    vector<vector<int>> name;
    vector <int> name1;
    name1.push_back(1);
    name1.push_back(3);
    vector <int> name2;
    name2.push_back(4);
    name.push_back(name1);
    name.push_back(name2);
    name1[100]=10;
    cout<<name1.size()<<endl;
    cout<<name1[100];
}

最佳答案

简短的回答是您正在调用未定义的行为,因此您不会在标准中找到任何关于必须发生的事情的进一步规范。

长答案是 C++ 是一种不安全的语言,不保证各种无效操作的任何类型的确定性错误,包括使用 operator[]< 越界访问 vector/。相反,它使用了广泛的未定义行为,它基本上允许任何发生:这个想法是通过允许用户灵活地避免他们知道的检查性能良好的代码可以实现冗余、良好的性能。

如果您希望 vector 检查您没有访问越界索引,没问题 - 只需使用 vector::at()它正是这样做的,并为无效访问抛出 std::out_of_range

至于为什么您的特定代码(显然)返回一个值,请注意 operator[] 的典型1 实现将直接访问底层存储,这意味着在汇编级别,您将从 vector 底层存储的开头访问 100 * sizeof(int) 字节。这通常是堆上的随机地址(因为存储通常是在堆上分配的),但它也可能是不可访问的地址,从而导致访问冲突。


1 某些编译器(例如 MSVC)将在“调试”模式下提供更多错误检查,这可能会导致 operator[] 调用 vector.at() 相反,它确实 进行范围检查并定义了行为,并且至少有一些其他编译器/标准库似乎也加入了这个想法。

关于c++ - 该 vector 的大小为 2,但它在索引 100 中仍有一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43175863/

相关文章:

c++ - 如何取消 std::async 函数?

c++ - 静态初始化困惑

c++ - std::sort 无法识别迭代器类别

android - 如何在android共享库中链接多个静态库

c++ - 类型别名错误

c++ - 为什么我可以定义一个函数,它的某些参数的顶级常量性不同?

c++ - Eclipse 未关闭以前的构建 CPU 使用率 100%

c++ - 移出的 xvalue 究竟需要什么?

c++ - CreateWindow 类方法抛出预期的类型说明符 - windows.h

c++ - 为什么 std::endl 会生成这个神秘的错误消息?