C++ c++;复制构造函数&;析构函数赋值

C++ c++;复制构造函数&;析构函数赋值,c++,C++,我正在编写这段代码,用户可以在其中输入姓名和年龄。然后,程序应打印出姓名,如果年龄超过19岁,则应打印出此人是否为成年人 [Input] Name : Rivf Age : 20 [Output] Rivf is adult. 我刚刚被介绍来复制构造函数和析构函数,所以我相信我的实现中有问题。代码运行并打印出所需的输出,但随后出现以下错误: Makefile:6: recipe for target 'cpp_run' failed make: *** [cpp_run] Error 134

我正在编写这段代码,用户可以在其中输入姓名和年龄。然后,程序应打印出姓名,如果年龄超过19岁,则应打印出此人是否为成年人

[Input]
Name : Rivf
Age : 20

[Output]
Rivf is adult.
我刚刚被介绍来复制构造函数和析构函数,所以我相信我的实现中有问题。代码运行并打印出所需的输出,但随后出现以下错误:

Makefile:6: recipe for target 'cpp_run' failed
make: *** [cpp_run] Error 134
munmap_chunk(): invalid pointer
Aborted (core dumped)
我非常感谢您的帮助,因为我刚刚开始学习构造函数和类附带的其他工具。由于这是一项作业,我无法更改
类person
中的任何内容。这是我的密码:

#include <iostream>
#include <string>
using namespace std;

class person{
private:
    string name;
    int*    age;
    bool  adult;
public:
    person();
    person(const person& other);
    void setName(string n);
    string getName();
    void setAge(int a);
    bool isAdult();
        ~person();
};
// (1) Implement class functions with constructor

person::person(){
}

void person::setName(string n){
    name = n;
}

void person::setAge(int a){
    age = new int;
    *age = a;
}


person::person( const person& other){
    this->name = other.name;
    this->age = other.age;
    this->adult = other.adult;
}


person::~person(){
    delete(age);
}

string person::getName(){
    return name;
}

bool person::isAdult(){

    if(*age > 19){
        adult = true;
    }
    else{
        adult = false;
    }
    return adult;
}

int main()
{
    // (2) make 'defultP' and 'newP' object

    person defaultP;
    person newP = defaultP;

    string name; int age;
    cout<<"Name : "; getline(cin, name);
    cout<<"Age : "; cin>>age;

    defaultP.setName(name);
    defaultP.setAge(age);
    // (3) print values with member functions of new object

    cout<<defaultP.getName();
    if(defaultP.isAdult() == true){
    cout << " is adult." << endl;
}
else{
    cout << " is kid." << endl;
}

    return 0;
}
#包括
#包括
使用名称空间std;
班主任{
私人:
字符串名;
国际*年龄;
布尔成人;
公众:
人();
人员(施工人员和其他人员);
void setName(字符串n);
字符串getName();
无效设置(INTA);
布尔·伊萨杜尔特();
~person();
};
//(1)使用构造函数实现类函数
person::person(){
}
void person::setName(字符串n){
name=n;
}
void person::setAge(int a){
年龄=新整数;
*年龄=a;
}
人员::人员(施工人员和其他人员){
this->name=other.name;
此->年龄=其他年龄;
此->成人=其他成人;
}
人物::~person(){
删除(年龄);
}
字符串person::getName(){
返回名称;
}
bool person::isAdult(){
如果(*年龄>19岁){
成人=真;
}
否则{
成人=假;
}
返回成人;
}
int main()
{
//(2)使“defultP”和“newP”对象
违约人;
person newP=defaultP;
字符串名;int-age;

你为什么要在年龄字段中使用int*而不仅仅是int?我想在两个对象都超出范围后,它会调用析构函数,并在第二个析构函数处失败,因为指针已经被释放。你是在双重删除int*年龄,这会导致未定义behaviour@Rivf--查看重复链接的“管理资源”部分例如,您的类缺少用户定义的赋值运算符,您未能在默认构造函数中初始化成员,等等。因此,一行程序
int main(){person p;}
调用未定义的行为。您的
main
成员完全没有必要;您只需要
bool person::isAdult(){return*age>19;}
。为什么要在年龄字段中使用int*而不是int?我认为在两个对象都超出范围后,它会调用析构函数,并在第二个析构函数处失败,因为指针已被释放。如果重复删除int*年龄,则会导致未定义behaviour@Rivf--查看重复链接的“管理资源”部分此外,您的类缺少用户定义的赋值运算符,您未能在默认构造函数中初始化成员,等等。因此,一行程序
int main(){person p;}
调用未定义的行为。您的
main
成员完全没有必要;您只需要
bool person::isAdult(){return*age>19;}