分段错误-读取初始化指针的数组

时间:2018-10-23 09:15:11

标签: c++ arrays pointers segmentation-fault

您能帮我一点问题吗?

我有以下课程;

class Link
{
  private:
    Demand *demand_[NUMBER_OF_CORES][NUMBER_OF_SLICES];

  public:
    Link()
    {
      for (int i = 0; i < NUMBER_OF_CORES; i++)
      {
        for (int j = 0; j < NUMBER_OF_SLICES; j++)
        {
          demand_[i][j] = NULL;
        }
      }
    }

    int virtualPut();
}

demand_数组会有问题。在构造函数中,一切都很好,初始化后我可以使用if (demand_[i][j] == NULL)

问题始于virtualPut()

int Link::virtualPut()
{
  for (int i = 0; i < NUMBER_OF_CORES; i++)
  {
    for (int j = 0; j < NUMBER_OF_SLICES; j++)
    {
      std::cout << "We're in " << i << " " << j << " \n" << std::flush;

      if (demand_[i][j] == NULL)  //SEGMENTATION FAULT
      {
        std::cout << "EMPTY\n";
      }
    }
  }
}

而且-如果我在构造函数中调用virtualPut()(仅用于测试),效果很好。

但是我在Link类之外使用。

void someFunction(Link *tab, int links)
{
  tab = new Link[links];

  tab[0].virtualPut();  //also just for test
}

这里可能是个问题?我知道我可以使用向量,但这不会帮助我理解此内存问题。

还有一件事-记忆博士说:

UNADDRESSABLE ACCESS: reading 0x0000000000000009-0x0000000000000011 8 byte(s)

但是为什么?

编辑! 问题已解决,谢谢

1 个答案:

答案 0 :(得分:0)

您显示给我们的代码还可以。我以巨大的价值站在自己的一边,没有Segfault。 您在Link类中声明了“ Demand * array of array”,这是一个有效的声明,应该分配内存。

我怀疑的是, NUMBER_OF_CORES和/或NUMBER_OF_SLICES在定义Link类的代码和定义virtualPut方法的代码中没有相同的值

>

类似:

#define NUMBER_OF_CORES 10
#define NUMBER_OF_SLICES 10
class Link
{
private:
    Demand *demand_[NUMBER_OF_CORES][NUMBER_OF_SLICES];
...
}

#define NUMBER_OF_CORES 5000
#define NUMBER_OF_SLICES 5000
int Link::virtualPut()
{
    for (int i = 0; i < NUMBER_OF_CORES; i++)
    {
        for (int j = 0; j < NUMBER_OF_SLICES; j++)
        {
        // here you will have buffer overflow
    ...
}

我会做什么:

  • 使用std :: vector
  • 可能使用单个条目数组并将其包装
  • 不要使用#define,这很麻烦
  • 不使用数组,它会导致缓冲区溢出

那将是这样的:

class Link
{
private:
    std::vector<Demand*> demand_;
    const int NUMBER_OF_CORES = 10;
    const int NUMBER_OF_SLICES = 50;
private:
    int getIdx(int i, int j)
    {
        return i*NUMBER_OF_SLICES + j;
    }
public:
    Link()
    {
        demand_.resize(NUMBER_OF_CORES * NUMBER_OF_SLICES);
        for (int i = 0; i < NUMBER_OF_CORES; i++)
        {
            for (int j = 0; j < NUMBER_OF_SLICES; j++)
            {
                demand_[getIdx(i,j)] = NULL;
            }
        }
    }
    int virtualPut();
};

注意:另外,您还向我们展示了一个virtualPut(),它应该返回一个int,但不会返回。