你能帮我一点问题吗?

我有以下类(class);

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
}

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

还有一件事-记忆博士说:
UNADDRESSABLE ACCESS: reading 0x0000000000000009-0x0000000000000011 8 byte(s)

但为什么?

编辑!
问题已在注释中解决,谢谢

最佳答案

您显示给我们的代码是。我以巨大的值(value)站在自己的一边,没有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,但不会返回。

    09-10 05:16