我正在尝试创建引用对象的构造函数。使用引用创建对象后,我需要打印两个对象的字段值。然后我必须删除第一个对象,并再次显示两个对象的字段值。我的类 Person 看起来像这样:
class Person {
char* name;
int age;
public:
Person(){
int size=0;
cout << "Give length of char*" << endl;
cin >> size;
name = new char[size];
age = 0;
}
~Person(){
cout << "Destroying resources" << endl;
delete[] name;
delete age;
}
void init(char* n, int a) {
name = n;
age = a;
}
};
这是我的实现(使用函数 show() )。我的教授说,如果此任务编写正确,它将返回错误。
#include <iostream>
using namespace std;
class Person {
char* name;
int age;
public:
Person(){
int size=0;
cout << "Give length of char*" << endl;
cin >> size;
name = new char[size];
age = 0;
}
Person(const Person& p){
name = p.name;
age = p.age;
}
~Person(){
cout << "Destroying resources" << endl;
delete[] name;
delete age;
}
void init(char* n, int a) {
name = n;
age = a;
}
void show(char* n, int a){
cout << "Name: " << name << "," << "age: " << age << "," << endl;
}
};
int main(void) {
Person *p = new Person;
p->init("Mary", 25);
p->show();
Person &p = pRef;
pRef->name = "Tom";
pRef->age = 18;
Person *p2 = new Person(pRef);
p->show();
p2->show();
system("PAUSE");
return 0;
}
最佳答案
你的复制构造函数的问题在于它仅仅分配了 p.name:
name = p.name // Now this and p hold a pointer to the same memory
因为 this
和 p
现在都持有一个指向相同内存位置的指针,无论哪个先析构都将释放内存,而第二个将持有指向同一内存位置的指针一个不存在的对象。随后使用该指针或将其删除将导致未定义的行为。解决方案是为 name 分配一个新数组并将 p.name 的内容复制到该数组中,这样就不会共享内存。
同样,您的 init 函数覆盖了 name,忽略了内存一直在分配的事实(这是内存泄漏),也忽略了字符串稍后将被破坏的事实(即使调用者可能希望拥有并释放它字符串,本身)。另外,我应该指出,您的 show 函数采用参数“n”,而是使用“name”。你的 show 函数可能不应该接受任何参数(事实上,你调用它的方式暗示它没有),因为所有需要的字段已经存在于你的类中(或者你可能打算将其作为一个独立的函数那需要类(class)的领域?)。您应该再看看您的代码是否有其他错误。
关于c++ - 构造函数在 C++ 中获取引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2856413/