代码之家  ›  专栏  ›  技术社区  ›  Sam

在“std::map”中存储对象时发生代码崩溃`

  •  1
  • Sam  · 技术社区  · 16 年前
     typedef std::map<int, MyObject*> MyMap;
     MyMap* myMap = new MyMap;
     // ...
     myMap->insert( MyMap::value_type( 0, objectOfType_MyObject ) );
    

    为什么我的代码会崩溃,堆栈跟踪会下降到

     std::less<int>::operator()
    

    ?

    我理解如果我使用一个定制的键类,我必须提供一个比较器,但这是一个int。

    我以前从来没有用过地图,这可能是一个愚蠢的问题,但我已经被困在这个问题上很久了。

    谢谢

    1 回复  |  直到 16 年前
        1
  •  11
  •   GManNickG    16 年前

    此代码对我有效(编译和运行):

    #include <map>
    
    class MyObject
    { };
    
    int main(void)
    {
        typedef std::map<int, MyObject*> MyMap;
    
        MyMap *myMap = new MyMap;
        MyObject *obj = new MyObject;
    
        myMap->insert(MyMap::value_type(0, obj));
    
        delete obj;
        delete myMap;
    }
    

    所以问题在于细节( // ... 或者什么 MyObject 可以)或其他地方。你也许可以把事情解决一点来帮助你。尽可能多地堆叠分配。你真的需要一个指向地图的指针吗?我建议你不要:

    #include <map>
    
    class MyObject
    { };
    
    int main(void)
    {
        typedef std::map<int, MyObject*> MyMap;
    
        MyMap myMap;
        MyObject *obj = new MyObject;
    
        myMap.insert(MyMap::value_type(0, obj));
    
        delete obj;
    }
    

    你真的需要存储指向对象或对象的指针吗?

    #include <map>
    
    class MyObject
    { };
    
    int main(void)
    {
        typedef std::map<int, MyObject> MyMap;
    
        MyMap myMap;
    
        myMap.insert(MyMap::value_type(0, MyObject()));
    }
    

    小得多,几乎不可能得到内存泄漏。如果你 需要存储指针,对于多态行为,请签出 boost::ptr_container library ,它有一个 map adapter that stores pointers .