okkk,以及我不得不重写我的所有代码和我的帖子,所以我希望我能得到帮助。我有两个类:PersonManager和Person。 PersonManager的目的是跟踪所有人员和人员的姓名。这里是我的全码:返回NULL将尝试使用的对象? (获取核心转储 - C++新手)
的main.cpp
#include <string>
#include <sstream>
#include <iostream>
#include <map>
using namespace std;
class Person
{
public:
Person();
void SetName(string s) {Name_ = s;}
string GetName() const {return Name_;}
private:
string Name_;
};
Person::Person()
{
Name_ = "";
}
class PersonManager
{
public:
PersonManager();
void NewPerson(string);
void GetRidOfPerson(string);
Person *GetPerson(string);
void Close();
private:
map<string, Person *> PersonMap_;
};
PersonManager::PersonManager()
{
PersonMap_.clear();
}
void PersonManager::NewPerson(string name)
{
for (map<string, Person *>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
if (it->first.compare(name) == 0)
{
return; // person already exists
}
}
Person *person = new Person;
PersonMap_.insert(pair<string, Person *>(name, person));
cout << "Created person: " << name << ".\n";
}
Person *PersonManager::GetPerson(string name)
{
for (map<string, Person *>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
if (it->first.compare(name) == 0)
{
return it->second;
}
}
cout << "Person: " << name << " not found." << endl;
return NULL;
}
void PersonManager::GetRidOfPerson(string name)
{
for (map<string, Person *>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
if (it->first.compare(name) == 0)
{
delete it->second;
PersonMap_.erase(it);
cout << "Deleted person: " << name << ".\n";
return;
}
}
cout << "Couldn't find person " << name << " for deletion.\n";
}
void PersonManager::Close()
{
for (map<string, Person *>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
delete it->second;
PersonMap_.erase(it);
cout << "Deleted person: " << it->first << ".\n";
}
PersonMap_.clear();
}
int main(void)
{
PersonManager person_manager;
person_manager.NewPerson("Tom");
person_manager.NewPerson("Tom");
person_manager.GetRidOfPerson("Tom");
person_manager.GetRidOfPerson("Abel");
person_manager.GetPerson("Tom")->SetName("Bob");
cout << person_manager.GetPerson("Tom")->GetName() << endl;
cout << person_manager.GetPerson("Bob")->GetName() << endl;
person_manager.Close();
return 0;
}
所有在检查的人不在列表中的main()函数的代码是用于测试目的!
如果你
person_manager.NewPerson("Tom");
,然后你做
person_manager.GetPerson("Tom")->SetName("Billy");
,然后尝试做:
person_manager.GetPerson("Tom")->GetName();
它将返回NULL,然后段错误。
所以在这个片断:
Person *PersonManager::GetPerson(string name)
{
for (map<string, Person *>::iterator it = PersonMap_.begin();
it != PersonMap_.end();
it++)
{
if (it->first.compare(name) == 0)
{
return it->second;
}
}
cout << "Person: " << name << " not found." << endl;
return NULL;
}
,所以我想出了一个解决方案:
Person *person = new Person;
return person;
问题是^是,是,我有未分配的内存。有没有其他方法可以做到这一点?
所有帮助表示赞赏,谢谢!
您可能需要重命名PersonManager :: PersonGinger()。 – 2011-12-29 05:53:24
你是什么意思 – evolon696 2011-12-29 05:55:04
有一个潜在的令人反感的方法名称。 – 2011-12-29 05:58:34