【问题标题】:Program crashes if I don't define a vector size如果我没有定义矢量大小,程序会崩溃
【发布时间】:2014-05-28 18:10:06
【问题描述】:

目前正在学习 C++,偶然发现了这个问题

std::vector<int> example;

example[0] = 27;

std::cout << example[0];

这会使程序崩溃,但如果我定义一个大小 std::vector&lt;int&gt; example(1) 它工作正常。我还注意到,如果我使用 example.push_back(27) 而不是 example[0] = 27 而不定义大小,它也可以正常工作。这背后有什么原因吗?

【问题讨论】:

    标签: c++ vector crash


    【解决方案1】:

    一个空向量在内存中没有分配任何元素。

    您应该使用example.push_back(27) 而不是尝试下标。 push_back() 分配一个新元素,然后将其添加到向量中。将新元素添加到向量后,可以使用 example[0] = something 重新分配它。

    【讨论】:

      【解决方案2】:

      原因很简单:空向量没有元素,所以你不能使用下标运算符。没有分配内存,也没有创建可以使用下标运算符访问它的元素 至于push_back 方法,它会在向量中添加一个元素。 也按照你写的方式使用构造函数

      std::vector<int> example(1)
      

      用一个元素创建一个向量。

      【讨论】:

        【解决方案3】:

        更具体地说,您使用的是默认构造函数,因此向量没有义务分配任何内存(因为您没有要求它)。

        所以如果你运行以下代码:

        std::vector<int> e;
        
        cout<< e.size() << endl; 
        cout<< e.capacity() << endl;
        

        它会打印 0 和 0。所以 size0

        正如documentation 所说:

        如果容器大小大于 n,则函数永远不会抛出 例外(不抛出保证)。否则,行为未定义。

        e.push_back(5);
        
        std::cout << e[0];
        

        会工作的。

        【讨论】:

          【解决方案4】:

          发件人:http://www.cplusplus.com/reference/vector/vector/operator[]/

          std::vector::operator[]

          访问元素

          返回对向量容器中位置 n 处元素的引用。

          类似的成员函数 vector::at 与此运算符函数具有相同的行为,不同之处在于 vector::at 进行了边界检查,并通过抛出 out_of_range 异常来指示请求的位置是否超出范围。

          便携式程序永远不应使用超出范围的参数 n 调用此函数,因为这会导致未定义的行为

          这在 STL 中可能会让人感到困惑,因为 std::map,例如:

          std::map<int, std::string> myMap;
          myMap[0] = "hello"
          

          如果映射不存在,将创建映射。

          【讨论】:

          • 句子“对于std::vector,operator[] 仅用于访问容器中的元素。”如果您创建一个大小为 5 的向量,则将项目分配给[3] 单元格是有问题的,请see this example,因为大小已经足够了。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-30
          • 1970-01-01
          • 1970-01-01
          • 2015-01-24
          • 1970-01-01
          相关资源
          最近更新 更多