【问题标题】:error after calling simple getter method: basic_string::_S_create调用简单 getter 方法后出错:basic_string::_S_create
【发布时间】: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


【解决方案1】:

将您的添加人更改为:

void PersonList::addPerson(Person& person)
{
    Person *person_ptr = new Person(person);
    personList.push_back(person_ptr);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2016-08-04
    • 2013-10-19
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多