c++ - 构造函数在 C++ 中获取引用

标签 c++ reference constructor

我正在尝试创建引用对象的构造函数。使用引用创建对象后,我需要打印两个对象的字段值。然后我必须删除第一个对象,并再次显示两个对象的字段值。我的类 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

因为 thisp 现在都持有一个指向相同内存位置的指针,无论哪个先析构都将释放内存,而第二个将持有指向同一内存位置的指针一个不存在的对象。随后使用该指针或将其删除将导致未定义的行为。解决方案是为 name 分配一个新数组并将 p.name 的内容复制到该数组中,这样就不会共享内存。

同样,您的 init 函数覆盖了 name,忽略了内存一直在分配的事实(这是内存泄漏),也忽略了字符串稍后将被破坏的事实(即使调用者可能希望拥有并释放它字符串,本身)。另外,我应该指出,您的 show 函数采用参数“n”,而是使用“name”。你的 show 函数可能不应该接受任何参数(事实上,你调用它的方式暗示它没有),因为所有需要的字段已经存在于你的类中(或者你可能打算将其作为一个独立的函数那需要类(class)的领域?)。您应该再看看您的代码是否有其他错误。

关于c++ - 构造函数在 C++ 中获取引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2856413/

相关文章:

Javascript:用变量引用数组,而不是复制它

java - Scala、Java 和平等

java - 程序没有看到重载构造函数

Java反射构造函数命令

android - Qt 不检测 Android NDK

c++ - _Unwind_ 和 unw_ 函数(LLVM 的 libunwind)

c++ - 如何在没有全局变量的情况下共享此数据

c++ - 类名后面的括号是否会创建一个新实例?

vb.net - 如何在没有 Visual Studio 的情况下在 vb.net 中添加引用?

c++ - 为什么在我没有传递类的实例时调用复制构造函数?