【问题标题】:How to handle a map with pointers?如何处理带有指针的地图?
【发布时间】:2012-05-07 05:04:23
【问题描述】:

假设我有一个名为 People 的类。我将指向这些人的指针存储在地图中

map<string, People*> myMap;

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

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

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

我也试过

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

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

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

非常感谢任何见解,谢谢

【问题讨论】:

    标签: c++ pointers map


    【解决方案1】:

    给定地图:

    map<string, People*> myMap;
    

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

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

    map<string, People> myMap;
    

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

    【讨论】:

      【解决方案2】:

      试试

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

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

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

      【讨论】:

        【解决方案3】:

        如果您想堆分配您的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;
        }
        

        【讨论】:

          【解决方案4】:

          尝试使用:

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

          两个都可以!!!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-06-05
            • 2013-09-29
            • 2019-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多