你能帮我一点问题吗?
我有以下类(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
...
}
我会怎么做:
那将是这样的:
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,但不会返回。