构造函数使用C ++进行引用

时间:2010-05-18 10:41:22

标签: c++ reference constructor

我正在尝试创建引用对象的构造函数。使用引用创建对象后,我需要打印两个对象的字段值。然后我必须删除第一个对象,并再次显示两个对象的字段值。我的班级人员看起来像这样:

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;
}

2 个答案:

答案 0 :(得分:1)

复制构造函数的问题在于它只分配了p.name:

name = p.name // Now this and p hold a pointer to the same memory

由于thisp现在都拥有指向同一内存位置的指针,因此无论哪一个先破解,都将释放内存,而第二个将占用指向不存在的对象的指针。随后使用该指针或删除它将导致未定义的行为。解决方案是为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);
}

它应该在运行时给你一个错误,它会让你有机会在你的实现中发现问题。