赋值运算符创建指针并且不能删除
Assignment operator creates pointer and doesn't make deleting possible
作为学校作业的一部分,我们必须创建一个摘要 class 并使用寄存器 class 来包含它们。摘要 class 下有两个 classes。
喜欢动物 > Dog/Cat
在这个任务中,我们必须创建一个赋值运算符,但在使用我创建的那个之后,程序出现了问题。
我做了两个寄存器
r1;
r2;
然后使用运算符
r2 = r1;
当程序退出时,它转到 r1 的析构函数,将其删除,到达 r2 并获得 "Access violation reading location"
我猜这是因为运算符创建了一个从 r2 到 r1 的指针,所以当 r1 被删除时。
接线员:
Register& Register::operator=(Registerconst &other)
{
for (int i = 0; i < this->count; i++)
{
delete this->animals[i];
}
delete[] this->animals;
this->name = other.name;
this->size = other.size;
this->count = other.count;
this->animals= new Animal*[this->size];
for (int i = 0; i < this->count; i++)
{
animals[i] = other.animals[i];
}
for (int i = count; i < this->size; i++)
{
this->animals[i] = nullptr;
}
return *this;
}
析构函数不是虚拟的。不确定是不是这个原因
根据要求,这里是使用的地方
AnimalRegister r1("Name 1");
AnimalRegister r2("Name 2");
// some stuff being added to r1
r2 = r1;
return 0;
构造函数:
AnimalRegister::AnimalRegister(string name)
{
this->name = name;
this->size = 10;
this->count = 0;
this->animals = new Animal*[this->size];
for (int i = 0; i < this->size; i++)
animals[i] = nullptr;
}
析构函数:
AnimalRegister::~AnimalRegister()
{
for (int i = 0; i < this->count; i++)
delete animals[i];
delete[] animals;
}
您遇到访问冲突的原因是您试图删除 Animal 指针两次。您的 Register 赋值运算符将 Animal pointers 从源对象复制到目标对象。 Register class 的析构函数删除它持有的 Animal 指针——因为它们在 r1 和 r2 中是相同的 Animal 指针,所以当您第二次尝试删除它们时会遇到访问冲突。
您需要决定谁拥有 Animal 指针。你的问题没有给我足够的信息来确定这一点。
如果 Register classes 之外的东西拥有这些动物,Register class 不应该删除它们。
如果寄存器 class 确实拥有它们,您需要通过 Animal 上的某种虚拟 clone() 方法对动物进行深度复制。
如果共享所有权,您应该使用 std::shared_ptr 来持有动物。
作为学校作业的一部分,我们必须创建一个摘要 class 并使用寄存器 class 来包含它们。摘要 class 下有两个 classes。 喜欢动物 > Dog/Cat
在这个任务中,我们必须创建一个赋值运算符,但在使用我创建的那个之后,程序出现了问题。
我做了两个寄存器
r1; r2;
然后使用运算符
r2 = r1;
当程序退出时,它转到 r1 的析构函数,将其删除,到达 r2 并获得 "Access violation reading location"
我猜这是因为运算符创建了一个从 r2 到 r1 的指针,所以当 r1 被删除时。
接线员:
Register& Register::operator=(Registerconst &other)
{
for (int i = 0; i < this->count; i++)
{
delete this->animals[i];
}
delete[] this->animals;
this->name = other.name;
this->size = other.size;
this->count = other.count;
this->animals= new Animal*[this->size];
for (int i = 0; i < this->count; i++)
{
animals[i] = other.animals[i];
}
for (int i = count; i < this->size; i++)
{
this->animals[i] = nullptr;
}
return *this;
}
析构函数不是虚拟的。不确定是不是这个原因
根据要求,这里是使用的地方
AnimalRegister r1("Name 1");
AnimalRegister r2("Name 2");
// some stuff being added to r1
r2 = r1;
return 0;
构造函数:
AnimalRegister::AnimalRegister(string name)
{
this->name = name;
this->size = 10;
this->count = 0;
this->animals = new Animal*[this->size];
for (int i = 0; i < this->size; i++)
animals[i] = nullptr;
}
析构函数:
AnimalRegister::~AnimalRegister()
{
for (int i = 0; i < this->count; i++)
delete animals[i];
delete[] animals;
}
您遇到访问冲突的原因是您试图删除 Animal 指针两次。您的 Register 赋值运算符将 Animal pointers 从源对象复制到目标对象。 Register class 的析构函数删除它持有的 Animal 指针——因为它们在 r1 和 r2 中是相同的 Animal 指针,所以当您第二次尝试删除它们时会遇到访问冲突。
您需要决定谁拥有 Animal 指针。你的问题没有给我足够的信息来确定这一点。
如果 Register classes 之外的东西拥有这些动物,Register class 不应该删除它们。
如果寄存器 class 确实拥有它们,您需要通过 Animal 上的某种虚拟 clone() 方法对动物进行深度复制。
如果共享所有权,您应该使用 std::shared_ptr 来持有动物。