我在C ++中有一个类项目。目标是在插入linked list时对电话簿(txt文件)进行排序。
以下是课程:
class Person
{
public:
string Name
string Firstname;
string Adress;
int PostalCode;
string Telephone;
Person();
~Person();
};
class Link
{
friend class List;
Link *next;
Person *pers;
public:
Link();
Link(string data);
};
class List
{
// debut is the start of the chained list
Link *start;
public:
List(string data)
{
start = NewLinkPerson(data, NULL);
}
};
Link::Link(string data)
{
next = NULL;
Person p;
p.put_data(data);
pers = &p;
}
Link::Link()
{
next = NULL;
Person p;
pers = &p;
}
然后,NewLinkPerson函数详细说明如下:
Maillon * NewLinkPerson(string data, Maillon *ssuiv)
{
Maillon * nouveau = new Maillon(data);
nouveau->suiv = ssuiv;
return nouveau;
}
问题是创建的对象不是我命令他创建的程序的对象。如果我在构造函数中输出Person类型的对象pers
,它将填充我询问的数据。
但是当它离开构造函数时,数据就会消失,并且会从内存中填充随机字符串。
可能导致此问题的原因是什么?我尝试了很多东西,但它们似乎都没有用,所有这些都主要返回了分段错误。
编辑:我忘了放在那里的功能:
void Person::put_data(string data)
{
int sep1 = data.find("|");
int sep2 = data.find("|", sep1+1);
int sep3 = data.find("|", sep2+1);
int sep4 = data.find("|", sep3+1);
Name = data.substr(0, sep1);
Firstname = data.substr(sep1+1, sep2-sep1-1);
Adress = data.substr(sep2+1, sep3-sep2-1);
Telephone = data.substr(sep4+1, data.npos);
string ccode = data.substr(sep3+1, sep4-sep3-1);
PostalCode = std::stoi(ccode.c_str());
}
编辑2 :翻译成英文
答案 0 :(得分:6)
您的代码有未定义的行为
Link::Link(string data)
{
next = NULL;
Person p;
p.put_data(data);
pers = &p;
}
Link::Link()
{
next = NULL;
Person p;
pers = &p;
}
在上述代码的两个构造函数中,您创建了一个本地Person
,p
,然后您pers
指向它。构造函数结束后p
超出范围,被销毁,现在pers
指向不再存在的对象。 <{1}}之后的任何解除引用仍将指向已删除的对象是未定义的行为。
要解决此问题,请删除pers
的指针。如果将其存储为值,则不需要任何动态内存分配,并且可以远离指针语法。链接应该是
pers
然后构造函数可以定义为
class Link
{
friend class List;
Link *next;
Person pers; // no pointer here
public:
Link();
Link(string data);
};
如果必须使用Link::Link(string data)
{
next = NULL;
pers.put_data(data);
}
Link::Link()
{
next = NULL;
}
作为指针,则可以使用pers
为其分配持久存储。如果你这样做,那么你需要确保你在类的析构函数中new
并且你有复制语义。有关详情,请参阅What is The Rule of Three?