我有一个包含另一个名为Sphere的类的数组的类。现在我不确定为什么代码的一部分会产生错误。
.H文件
sphere* list;
int listlen;
void add(sphere x);
sarray operator +(const sarray& arrayone);
.CPP
sarray::sarray()
{
listlen = 0;
list = new sphere[200000];
}
sarray::~sarray()
{
delete [] this->list;
}
void sarray::add(sphere x) // Function for adding spheres to the list.
{
listlen++;
list[listlen-1] = x;
}
void sarray::operator = (const sarray& arrayone)
{
this -> list = NULL;
for(int i = 0; i < arrayone.listlen; i++)
{
this -> add(arrayone.list[i]);
}
}
sarray sarray::operator +(const sarray& arrayone)
{
sarray temparray;
for(int i = 0; i < arrayone.listlen; i++) // add all the elements from the first array to the temporary one
{
//sphere temp = arrayone.list[i];
temparray.add(arrayone.list[i]);
}
for(int j = 0; j < this -> listlen; j++)// add all the elements from the second array to the temporary one
{
temparray.add(list[j]);
}
return temparray;
}
sphere类有一个名为“Radius”的成员变量 当我尝试比较像这样
float a = 10;
for(int i=0; i > this->listlen;i++)
if(this->list[i].Radius > a) //<-- Can read the values
工作正常,但在更改代码的这一部分时
float a = 10;
sarray temparray = arrayone + *this;
for(int i = 0; i < temparray.listlen; i++)
if(temparray.list[i].radius > a) // Error comes here!
"Unhandled exception at 0x00138503: Access violation reading location"
虽然这样做了。我想问题出在Add / operator函数中,但我找不到它。
答案 0 :(得分:2)
以下部分看起来有问题:
void sarray::add(sphere x) // Function for adding spheres to the list.
{
list[listlen-1] = x;
}
你应该喜欢这样的东西
void sarray::add(sphere x) // Function for adding spheres to the list.
{
list[listlen++] = x;
}
另外,您最好在添加方法中进行一些错误检查。
答案 1 :(得分:1)
好的,看过析构函数,你在sarray中有一个指向sphere的指针,并有一个析构函数来销毁指针。除非您没有定义自己的复制构造函数,这意味着使用了默认的复制构造函数,否则这一切都很好。在返回temparray的函数operator +中,返回本地副本的副本。调用默认的复制构造函数来创建副本。然后当地人将被毁坏。现在,返回的sarray副本列表将指向无效数据。您需要定义自己的复制构造函数以制作列表指针的深层副本。