为什么在将元素插入类中的数据向量时出现分段错误?

Ani*_*aha 5 c++ insert segmentation-fault stdvector c++11

我在向量中插入数据时收到分段错误。我认为载体没有分配。

我不想reserve大小。怎么做?

class A
{
private:
    struct data
    {
        int x;
        int y;
    };
    std::vector<data>Set;

public:
    void insert()
    {
        Set[0].x = 5; Set[0].y = 6;
    }
};

A a;
a.insert(); // Segmentation Fault
Run Code Online (Sandbox Code Playgroud)

AF_*_*cpp 8

使用 std::vector::push_back()

访问第一个元素(Set[0])是未定义的行为。

默认构造的向量为空。

  • 确实是正确的答案,但我可以建议做一些修改?您可以将`push_back`链接到https://en.cppreference.com/w/cpp/container/vector/push_back,并用反引号将代码段格式化。 (3认同)
  • @BoBTFish我认为通常这样做是高度认可的,即使不问:) (2认同)
  • 抱歉。我做的大多数都是糖水,但链接到** de **。cppreference并不是一个好主意。(这可能会变成德语的翻译主题。)我投票赞成... ;-) (2认同)

JeJ*_*eJo 4

我认为向量没有分配。

是的,您走在正确的轨道上。由于沿线访问未分配的向量,您有未定义的行为。

 Set[0].x = 5; Set[0].y = 6;
Run Code Online (Sandbox Code Playgroud)

您可以简单地std::vector::push_back按如下方式std::vector::emplace_back构造data,不需要通过下标运算符访问向量:

void insert()
{
    Set.push_back(data{ 5, 6 });
    // or
    // Set.emplace_back(data{ 5, 6 });
}
Run Code Online (Sandbox Code Playgroud)

注意:如果data包含非基本类型,则考虑使用std::vector::emplace_back构造data in-place,而不是像给定代码中那样默认构造和分配成员。您还需要为其提供合适的构造函数data