为什么我在向 class 内的数据向量插入元素时出现分段错误?

Why I am getting a segmentation fault while inserting elements to the vector of data inside the class?

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

我不想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

使用 std::vector::push_back().

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

默认构建的向量为空。

I think the vector is not allocated.

是的,你走对了。由于 accessing un-allocated 沿线向量,您有未定义的行为。

 Set[0].x = 5; Set[0].y = 6;

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

void insert()
{
    Set.push_back(data{ 5, 6 });
    // or
    // Set.emplace_back(data{ 5, 6 });
}

注意:如果data包含,non-primitive类型,则考虑使用std::vector::emplace_back构造datain-place,而不是 default-constructing 并分配成员,如在给定代码中那样。您还需要为 data 提供合适的构造函数。

默认情况下,创建的向量的大小为 0,因此尝试访问元素 Set[0] 是错误的,并且会产生分段错误(这里意味着访问不存在的内容)。

使用std::vector::push_back避免分段错误

您可以像这样重写函数:

void insert()
    {
      data newItem;
      newItem.x = 5; newItem.y = 6
      Set.push_back(newItem)
    }