【发布时间】:2013-12-15 03:08:39
【问题描述】:
我有一个简单的函数,它使用 getter 方法打印出一个人的姓名。它第一次打印出名称很好,但第二次它抛出错误并停止工作。
调试器显示,在进行初始调用后,人员姓名的值从它应该的值变为乱七八糟的随机字母和数字。
任何帮助将不胜感激。
error basic_string::_S_create
string personName("Jim");
// check if person already exists (will return NULL in
// the case of Jim during this test)
Person *person = personList.getPerson(personName);
if(!person)
{
cout << "creating new person" << endl;
person = createPerson(personName);
cout << person->getName() << endl; // prints 'Jim'
cout << person->getName() << endl; // stops working here.
}
Person* createPerson(string name)
{
Person person(name);
personList.addPerson(person);
Person *foundPerson = personList.getPerson(name);
return foundPerson;
}
人员列表
...
void PersonList::addPerson(Person& person)
{
Person *person_ptr = &person;
personList.push_back(person_ptr);
}
Person* PersonList::getPerson(string name)
{
for(vector<Person*>::iterator it = personList.begin(); it != personList.end(); ++it)
{
if((*it)->getName() == name)
{
return *it;
}
}
}
...
人
class Person
{
public:
Person(string _name)
string getName() const;
...
private:
string name;
...
}
...
Person::Person(string _name)
:name(_name)
{
}
string Person::getName() const
{
return name;
}
...
【问题讨论】:
-
显示编译、运行和显示问题的最小代码。
-
@PeteBecker 谢谢。我会试一试的。我还展示了包含迭代器的 getPerson 函数。我想知道这是否就是它不断变化的原因。
-
不是解决方案,但我注意到 getPerson() 中 for 循环中的比较是错误的。您应该使用它!=personList.end() 而不是它!=personList.begin()。
-
另外,如果查找失败,getPerson() 需要返回 0。你的编译器应该已经警告你了。我们可以看看 createPerson 吗?我怀疑您正在将一个悬空指针推入 PersonList。
-
@HariMahadevan 谢谢。这只是一个错字。
标签: c++ string pointers runtime-error getter