【发布时间】:2015-07-26 17:12:54
【问题描述】:
我有这样的代码,
#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);
}
然后我运行我的代码,一个错误(调试断言失败!)弹出。您还可以看到析构函数被调用了两次。但是如果我把~Person里面的delete [] k;去掉,就不会出现这样的弹窗错误了。
Person构造函数中有动态分配:
k = new Kidney[2];
k[0] = Kidney(kpf1);
k[1] = Kidney(kpf2);
所以我认为我应该在析构函数中删除 k 。 我的问题是为什么会调用两次析构函数以及如何解决错误?
我正在使用 VS 2013。
谢谢!
【问题讨论】:
-
What is The Rule of Three? 的可能重复项
-
使用矢量来避免此类问题
-
@Sneftel 是的,这是由于缺少复制构造函数引起的
-
添加一个复制构造函数/assignemnt 操作,其中包含打印语句。并观察创建对象的副本。一直打开优化,观察多余的复制和删除都被删除了。注意:如果你没有定义它们,编译器会自动生成它们而不需要打印语句。
标签: c++ class visual-studio-2013 destructor