这是代码,我创建了一个包含另一个类的对象的类。我得到错误的输出,即垃圾值..我无法弄清楚什么是问题。
突出显示的行,s输出给出了垃圾值,但编译时没有错误。一直在使用MS Visual Studio 2010
#include<iostream>
#include<conio.h>
#include<string>
#include<cstring>
using namespace std;
class Address
{
char *street_no,*house_no,*city,*code;
public:
**Address(Address &obj)
{
int size;
cout<<obj.street_no;
size=strlen(obj.street_no);
street_no=new char[size+1];
strcpy(street_no,obj.street_no);
size=strlen(obj.house_no);
house_no=new char[size+1];
strcpy(house_no,obj.house_no);
size=strlen(obj.city);
city=new char[size+1];
strcpy(city,obj.city);
size=strlen(obj.code);
code=new char[size+1];
strcpy(code,obj.code);
}**
Address()
{
street_no=new char;
house_no=new char;
city=new char;
code=new char;
}
~Address()
{
delete street_no;
delete house_no;
delete city;
delete code;
}
void set()
{
cout<<"Enter Street Number : ";
cin>>street_no;
cout<<"Enter House Number : ";
cin>>house_no;
cout<<"Enter City : ";
cin>>city;
cout<<"Enter Code : ";
cin>>code;
}
void get()
{
cout<<"\nStreet Number : "<<street_no;
cout<<"\nHouse Number : "<<house_no;
cout<<"\nCity : "<<city;
cout<<"\nCode : "<<code;
}
};
class person
{
Address obj;
public:
person()
{
}
person(person &one)
{
Address::Address(one.obj);
}
void set()
{
obj.set();
}
void get()
{
obj.get();
}
~person()
{
exit(0);
}
};
int main()
{
person A;
A.set();
A.get();
**
person B(A);
B.get();
**
getch();
}
答案 0 :(得分:2)
Address()
{
street_no=new char;
house_no=new char;
city=new char;
code=new char;
}
这是你的第一个问题开始的地方。使用默认构造函数时,您将创建指向单个char
的指针。当您尝试复制对象时,您会收到垃圾,因为strlen
将查找\0
字符来确定长度(除非您的char
只是'\ 0 ',你将在UB的杂草中出发)。您的get
和set
函数也会出现这种情况,因为它们会尝试写出char*
(但实际上是期望一个带有终止空字符的数组),并在char*
(同样的期望),但你只给他们1个字符写。换句话说,你将用你所写的东西在整个地方调用UB。
~Address()
{
delete street_no;
delete house_no;
delete city;
delete code;
}
这适用于您的默认构造函数(如编写),但对于您的复制构造函数不正确。修复默认构造函数后,这两者都不正确。创建新数组(new[]
)时,必须使用delete[]
释放内存。
可以使用std::string
修复整个问题,而不是尝试自己管理动态数组。
答案 1 :(得分:0)
在C ++中使用类'string'而不是char *。你不需要管理内存。所以替换
char *street_no,*house_no,*city,*code;
与 string street_no,house_no,city,code;