1 c++ destructor class visual-studio-2013
我有这样的代码,
#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);
}
Run Code Online (Sandbox Code Playgroud)
然后我运行我的代码,一个错误(调试断言失败!)弹出。您还可以看到析构函数被调用了两次。但是如果我把delete [] k;~Person里面的去掉,就不会出现这样的弹窗错误了。
Person 构造函数中有动态分配:
k = new Kidney[2];
k[0] = Kidney(kpf1);
k[1] = Kidney(kpf2);
Run Code Online (Sandbox Code Playgroud)
所以我想我应该在析构函数中删除 k 。我的问题是为什么析构函数被调用两次以及如何解决错误?
我正在使用 VS 2013。
谢谢!
问题如下。在行中
Person p = Person("Jack", "Bowen", 24, 60, 0.99, 0.98);
Run Code Online (Sandbox Code Playgroud)
您正在复制初始化p,即您正在创建一个临时文件,然后将其复制到Person p;. 最后,临时对象Person("Jack", "Bowen", 24, 60, 0.99, 0.98);被销毁,因此您的Kidney*指针悬空,因为您没有实现复制构造函数并且副本很浅(即正在复制指针本身,而不是它指向的对象)。并且您的析构函数被调用两次,因为它首先在临时结束时(在语句结束时)被调用,然后Person p在main().
任何时候你的类有一个指针,实现它的复制构造函数和赋值运算符。或者更好的是,使用智能指针,例如std::shared_ptr,甚至更好的标准容器来跟踪其动态内存等std::vector/std::list。
快速修复您的代码(但实际上,您必须实现复制构造函数,因为您将遇到所有其他类型的问题,例如Person从函数返回s 或Person按值传递s时):
Person p("Jack", "Bowen", 24, 60, 0.99, 0.98);
Run Code Online (Sandbox Code Playgroud)
这避免了任何临时并使用直接初始化。
PS:在g++,编译-Weffc++警告你这些问题,
警告:'class Person' 具有指针数据成员 [-Weffc++] 但不会覆盖 'Person(const Person&)' [-Weffc++] 或 'operator=(const Person&)' [-Weffc++]
不过,我不确定 VS 是否存在这样的编译器标志。
| 归档时间: |
|
| 查看次数: |
1478 次 |
| 最近记录: |