2012-04-26 73 views
5

考虑一下我有一个类名人。我存储的指针这些人在地图如何使用指针处理地图?

map<string, People*> myMap; 

要创建新的人,我使用贴图[]运营商。

myMap["dave"]->sayHello(); 

但是,这给了我一个分段错误,它甚至不叫人民类的构造函数。

我也试过

myMap.insert(std::make_pair("dave", new People())); 

但是这并没有改变什么,构造仍旧没有和程序关闭处理这个代码的分割错误。

如何访问和操作带有指针的地图?为什么不是上述工作,我没有得到编译时错误或警告。

任何见解大加赞赏,谢谢

回答

9

鉴于地图:

map<string, People*> myMap; 

operator[]不会创造新的People,这将创建People*,即指针不指向任何东西。

最简单的办法是让你的地图真的含有的人,不是指针,例如:

map<string, People> myMap; 

那么内存管理是处理所有为你使用operator[]将建立新的人需要。

+1

或智能指针,如果'人'的建设很贵 – 2012-04-26 13:17:15

+0

感谢您的明确解释! – user1356190 2012-04-26 14:35:04

2

尝试

myMap["dave"] = new People(....); 

new将调用构造函数,返回一个指针,并把它插入到地图中。

虽然你需要小心内存泄漏。使用智能指针来解决这个问题。

+0

谢谢你在我目前的实施中完美的工作。 – user1356190 2012-04-26 14:34:04

0

如果你想堆分配你的People但使用地图,看看Boost Pointer Containers,特别是boost::ptr_map。它只是标题,所以你不需要编译任何额外的库。

#include <iostream> 
#include <string> 
#include <boost/ptr_container/ptr_map.hpp> 

struct People 
{ 
    int age; 
}; 

typedef boost::ptr_map<std::string,People> PeopleMap; 

int main(int,char**) 
{ 
    PeopleMap data; 

    data["Alice"].age = 20; 
    data["Bob"].age = 30; 

    for (PeopleMap::const_iterator it = data.begin(); it != data.end(); ++it) 
     std::cout << "Name: " << it->first << " Age: " << it->second->age << std::endl; 

    return 0; 
} 
0

尝试使用:

People* new_people = new People (member_variable1,member_variable2); 

myMap.insert(std::pair<std::string, People*>("key for string",new_people)); 

或以其他方式:

People new_people(member_variable1,member_variable2); 
myMap.insert(std::pair<std::string, People*>("key for string",&new_people)); 

双方将工作!