我正在尝试创建引用对象的构造函数。使用引用创建对象后,我需要打印两个对象的字段值。然后我必须删除第一个对象,并再次显示两个对象的字段值。我的班级人员看起来像这样:
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;
}
答案 0 :(得分:1)
复制构造函数的问题在于它只分配了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函数可能不应该采用任何参数(实际上,你调用它的方式意味着它没有),因为你的类中已经存在所有需要的字段(或者你可能希望它是一个独立的函数需要该类的字段?)。您应该再看一下代码中的其他错误。
答案 1 :(得分:0)
首先,尝试编译代码(在将代码发布到SO之前编译代码通常是个好主意。)它包含几个错误,编译器会显示它们。第二部分将改变以下内容:
p->init("Mary", 25);
到
{
std::string mary("Mary");
p->init(mary.c_str(), 25);
}
它应该在运行时给你一个错误,它会让你有机会在你的实现中发现问题。