如何使用指针处理地图?

时间:2012-04-26 12:55:20

标签: c++ pointers map

考虑我有一个班级人物。我在地图中存储指向这些人的指针

map<string, People*> myMap;

要创建新人,我使用maps []运算符。

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

但是这给了我一个分段错误,它甚至都没有调用People类的构造函数。

我也试过

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

但是这没有改变任何东西,构造函数仍然没有被调用,程序关闭处理这段代码时出现分段错误。

如何使用指针访问和操作地图?为什么上面没有工作,我没有编译时错误或警告。

非常感谢任何见解,谢谢

4 个答案:

答案 0 :(得分:9)

鉴于地图:

map<string, People*> myMap;

operator[]不会创建新的People,它会创建People*,即指向不指向任何内容的指针。

最简单的解决方案是让你的地图真正包含人,而不是指针,例如:

map<string, People> myMap;

然后内存管理全部为您处理,使用operator[]将根据需要构建新人。

答案 1 :(得分:2)

尝试

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

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

但是你需要注意内存泄漏。使用智能指针来解决这个问题。

答案 2 :(得分: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;
}

答案 3 :(得分: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) );

两者都有效!!!