gpt4 book ai didi

c++ - 段错误 - 读取初始化指针数组

转载 作者:太空宇宙 更新时间:2023-11-04 12:43:24 26 4
gpt4 key购买 nike

你能帮我解决一些小问题吗?

我有以下类(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 ,但这无助于我理解这个内存问题。

还有一件事 - Memory 博士说:

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

但为什么呢?

编辑!问题在评论中解决,谢谢

最佳答案

您向我们展示的代码没有问题。我以巨大的值(value)在我身边运行它,并且没有段错误。您在 Link 类中声明了一个“Demand* array of array”,这是一个有效的声明,应该分配内存。

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

类似的东西:

#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();
};

注意:另外,您向我们展示了一个应该返回 int 但没有返回的 virtualPut()。

关于c++ - 段错误 - 读取初始化指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52945389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com