繁体   English   中英

赋值运算符创建指针,无法删除

[英]Assignment operator creates pointer and doesn't make deleting possible

作为学校作业的一部分,我们必须创建一个抽象类并使用注册类来包含它们。 抽象类有两个下层类。 像动物>狗/猫

在此任务中,我们必须创建一个赋值运算符,但是在使用我编写的赋值运算符之后,程序遇到了问题。

我做了两个寄存器

r1; r2;

然后使用运算符

r2 = r1;

并在程序退出时转到r1的破坏程序,将其删除,转到r2并获得“访问冲突读取位置”

我猜这是因为运算符创建了一个从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;
}

出现访问冲突的原因是,您尝试两次删除动物指针。 您的寄存器分配运算符将动物指针从源对象复制到目标对象。 Register类的析构函数将删除其持有的Animal指针-由于它们与r1和r2中的Animal指针相同,因此您在尝试第二次删除它们时会遇到访问冲突。

您需要确定谁拥有动物指针。 您的问题没有给我足够的信息来确定这一点。

如果Register类之外的某些东西拥有Animals,则Register类不应删除它们。

如果注册类确实拥有它们,则需要通过Animal上的某种虚拟clone()方法来制作动物的深层副本。

如果所有权是共享的,则应使用std :: shared_ptr来保存动物。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM