7

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

map<string, People*> myMap;

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

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

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

我也试过

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

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

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

任何见解都非常感谢,谢谢

4

4 回答 4

12

给定地图:

map<string, People*> myMap;

operator[]不会创建 new People,而是会创建People*,即不指向任何东西的指针。

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

map<string, People> myMap;

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

于 2012-04-26T12:58:38.087 回答
3

尝试

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

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

不过,您需要小心内存泄漏。使用智能指针来解决这个问题。

于 2012-04-26T12:59:33.747 回答
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) );

两者都会工作!

于 2013-04-06T00:05:20.107 回答
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;
}
于 2012-04-26T13:28:38.150 回答