У меня есть такой код, как,[C++] Почему мой деструктор класса называется дважды?
#include <iostream>
#include <string>
using namespace std;
class Heart {
private:
int bpm;
public:
Heart(int bpm) : bpm(bpm) {}
int getBPM() {
return bpm;
}
};
class Kidney {
private:
double PercentFunction;
public:
Kidney() : PercentFunction(0) {}
Kidney(double pf) : PercentFunction(pf) {}
double getPF() {
return PercentFunction;
}
};
class Person {
private:
string fname, lname;
int age;
Heart h;
Kidney* k;
public:
Person(string fn, string ln, int age, int bpm, double kpf1, double kpf2) : fname(fn), lname(ln), age(age), h(bpm) {
k = new Kidney[2];
k[0] = Kidney(kpf1);
k[1] = Kidney(kpf2);
cout << fname << " " << lname << ", aged " << age << ". Heart BPM : " << bpm <<
". Kidneys' percent function indices: " << k[0].getPF() << " and " << k[1].getPF() << '.' << endl;
}
~Person() {
cout << "A person is dying!" << endl;
delete[] k;
}
};
int main() {
Person p = Person("Jack", "Bowen", 24, 60, 0.99, 0.98);
}
Тогда я запускаю мой код, ошибка (Debug Assertion Failed!) Выскакивает. И вы также можете увидеть, как деструктор вызывается дважды. Но если я удалю delete [] k;
в ~ Person, такой всплывающей ошибки не будет.
Существует динамическое распределение в конструктор Person:
k = new Kidney[2];
k[0] = Kidney(kpf1);
k[1] = Kidney(kpf2);
Так что я думаю, что я должен удалить к в деструкторе. Мой вопрос, почему деструктор называется дважды и как решить эту ошибку?
Я использую VS 2013.
Спасибо!
возможно дубликат [Что такое Правило трех?] (Http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) – Sneftel
использования вектора, чтобы избежать таких проблем, – Gabriel
@Sneftel Да, это вызвано отсутствием конструктора копий – StenSoft