[英]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++ ;
我已经重载了 << 运算符。
这些陈述
if (nume != nullptr)
delete[] nume;
if (dmgAbilitati != nullptr)
delete[] dmgAbilitati;
没有意义,因为数据成员nume
和dmgAbilitati
尚未初始化。 更准确地说,memory 都没有分配到它们指向的位置。
所以这些语句调用未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.