我有一个编写动态分配2D数组的类的赋值,然后我必须编写函数来处理它。其中一个功能是operator +的过载功能。一切都按预期工作,甚至是操作符+函数,直到程序调用析构函数。析构函数具有释放先前分配的内存的简单任务。我知道代码是正确的,我已经手动测试了,但是当计算机在程序结束时调用此函数时,我得到“2DArray.exe中的0x000566E1处的未处理异常:0xC0000005:访问冲突读取位置0xFEEEFEF2。” 我尝试了各种各样的事情,我已经在这个问题上待了两天了,我已经筋疲力尽了。它本周五到期。如果有人可以尝试和帮助,我将不胜感激。
以下是我认为问题所在的两个函数。另外,请注意,当没有析构函数时,程序运行完全正常,但我必须确保在程序退出之前释放内存,其中作业。
Square_Matrix Square_Matrix::operator+(Square_Matrix & object)
{
Square_Matrix sum;
sum.Set_Size(size);
for (int i = 0; i < size; i++)
{
for (int b = 0; b < size; b++)
{
sum.Set_Elem((matrix[i][b] + object.Get_Elem(i, b)),i, b);
}
}
return sum;
}
Square_Matrix::~Square_Matrix()
{
// destructor
// release the allocated memory
if (size > 0)
{
for (int d = 0; d < size; d++)
{
delete[] matrix[d];
}
delete[] matrix;
size = 0;
}
}
答案 0 :(得分:1)
看起来你需要一个复制构造函数。
此外,您对operator +的参数应为const Square_Matrix &object
。你没有任何改变第二个对象的意图,对吗?告诉编译器。它会很感激。
事实上,你没有任何改变第一个对象的意图,所以你应该声明它Square_Matrix Square_Matrix::operator+(const Square_Matrix & object) const
第二个const
告诉编译器也使this
成为一个const指针。
答案 1 :(得分:0)
当您删除动态分配的数组中的所有值时,您将取消分配整个内容。
for (int d = 0; d < size; d++)
{
delete[] matrix[d];
}
您必须删除该行
delete[] matrix;
它应该停止给出例外。