您能帮我一点问题吗?
我有以下课程;
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)
但是为什么?
编辑! 问题已解决,谢谢
答案 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
...
}
我会做什么:
那将是这样的:
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,但不会返回。