如何处理带有指针的地图

How to handle a map with pointers?

本文关键字:指针 地图 何处理 处理      更新时间:2023-10-16

考虑我有一个类名人。我在地图上存储指向这些人的指针

map<string, People*> myMap;

要创建新的人,我使用地图 [] 运算符。

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

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

我也试过

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

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

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

任何见解非常感谢,谢谢

给定地图:

map<string, People*> myMap;

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

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

map<string, People> myMap;

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

尝试

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

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

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

如果你想堆分配你的People但使用地图,看看一个提升指针容器,特别是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;
}

尝试使用:

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) );

两者都会起作用!!