gpt4 book ai didi

C++ 类析构函数无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:53 25 4
gpt4 key购买 nike

#include<iostream>
#include<cstring>
using namespace std;
class Animal
{
protected:
int age;
char* name;
public:
Animal()
{
name=new char[1];
age = 0;
strcpy(name," ");
}
Animal(int _age, char* _name)
{
age=_age;
name = new char[strlen(_name)+1];
strcpy(name, _name);
}

~Animal()
{
delete[] name;
}

friend istream& operator >>(istream& in, Animal& a);
friend ostream& operator <<(ostream& out, const Animal& a);

};
istream& operator >>(istream& in, Animal& a)
{
in>>a.name>>a.age;
return in;
}
ostream& operator <<(ostream& out, const Animal& a)
{
out<<a.name<<a.age;
return out;
}


int main()
{
Animal a;
cin>>a;
cout<<a;
return 0;
}

这段代码让我有机会输入a,然后打印它,然后屏幕卡住并停止工作。如果我删除析构函数,它会正常工作。为什么会这样?真的是因为析构函数吗?

最佳答案

您分配一个大小为 1 的 C 字符串,并将大小为 2 的 C 字符串 ""复制到它。此外,您在“istream& operator >>(istream& in, Animal& a)”中的名称中读取了未知数量的字符。两者都会破坏名称指向的内存,并且都可以使用 std::string:

轻松修复
class Animal
{
protected:
int age;
std::string name;

public:
Animal()
: age(0)
{}

Animal(int age_, std::string name_)
: age(age_), name(name_)
{}
};

这避免了编写代码中缺少的析构函数、复制构造函数和赋值运算符(参见:Rule of three)。

关于C++ 类析构函数无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23651060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com