簡體   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