繁体   English   中英

在复制构造函数中释放 memory 的问题

[英]Problems freeing memory in a copy constructor

我有这个父 class

class Monster 
{
    char* nume;
    double hp;
    float* dmgAbilitati;
    int nrAbilitati;
}

使用此复制构造函数

Monster(const Monster& src)
    {
        if (nume != nullptr)
            delete[] nume;
        this->nume = new char[strlen(src.nume) + 1];
        strcpy_s(this->nume, strlen(src.nume) + 1, src.nume);
        this->hp = src.hp;
        this->nrAbilitati = src.nrAbilitati;
        if (dmgAbilitati != nullptr)
            delete[] dmgAbilitati;
        this->dmgAbilitati = new float[this->nrAbilitati];
        for (int i = 0; i < this->nrAbilitati; i++)
            this->dmgAbilitati[i] = src.dmgAbilitati[i];
    }

我在问是否必须使用这些语句

if (nume != nullptr)
            delete[] nume;
if (dmgAbilitati != nullptr)
            delete[] dmgAbilitati;

因为我试图重载这个子 class 中的前/后增量运算符

class giantSpider : private Monster
{
    int durataStun;

.
.
.
const giantSpider operator++(int)
    {
        giantSpider aux(*this);
        durataStun++;
        return aux;
    }
}

它会引发如下图所示的异常(有时也可以),如果我不包括这些陈述,一切都很好。

我正在使用这个构造函数来初始化参数

Monster(const char* nume, double hp, int nrAbilitati, float* dmgAbilitati)
    {
        if (nume == nullptr)
            throw new exception("Nume invalid!\n");
        else
        {
            this->nume = new char[strlen(nume) + 1];
            strcpy_s(this->nume, strlen(nume) + 1, nume);
        }
        if (hp <= 0)
            throw new exception("Hp invalid!\n");
        else
            this->hp = hp;
        if (nrAbilitati <= 0 && dmgAbilitati == nullptr)
            throw new exception("nrAbilitati invalid sau dmgAbilitati invalid!\n");
        else
        {
            this->nrAbilitati = nrAbilitati;
            this->dmgAbilitati = new float[nrAbilitati];
            for (int i = 0; i < nrAbilitati; i++)
                this->dmgAbilitati[i] = dmgAbilitati[i];
        }
    }

对于孩子:

giantSpider(const char* nume, double hp, int nrAbilitati, float* dmgAbilitati, int durataStun)
        :Monster(nume, hp, nrAbilitati, dmgAbilitati)
    {
        if (durataStun <= 0)
            throw new exception("Numar introdus invalid!\n");
        else
            this->durataStun = durataStun;
    }

这主要是:

float v1[] = { 125,234.22,8643.3 };
giantSpider  g2("Ana", 1000, 3, v1, 3);
cout << g2 << ++g2 << g2++ ;

我已经重载了 << 运算符。

https://i.stack.imgur.com/u6kiz.png

这些陈述

if (nume != nullptr)
            delete[] nume;
if (dmgAbilitati != nullptr)
            delete[] dmgAbilitati;

没有意义,因为数据成员numedmgAbilitati尚未初始化。 更准确地说,memory 都没有分配到它们指向的位置。

所以这些语句调用未定义的行为。

暂无
暂无

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

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