在`std :: map`中存储对象时代码崩溃

Sam*_*Sam 2 c++ stl map

 typedef std::map<int, MyObject*> MyMap;
 MyMap* myMap = new MyMap;
 // ...
 myMap->insert( MyMap::value_type( 0, objectOfType_MyObject ) );
Run Code Online (Sandbox Code Playgroud)

为什么我的代码会因堆栈跟踪而崩溃

 std::less<int>::operator()
Run Code Online (Sandbox Code Playgroud)

我明白,如果我使用自定义键类,我必须提供一个比较器,但这是一个int.

我之前从未使用过地图,这可能是一个愚蠢的问题,但我现在已经坚持了很久.

谢谢

GMa*_*ckG 11

这段代码适用于我(编译和运行):

#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;
}
Run Code Online (Sandbox Code Playgroud)

所以问题在于细节(// ...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;
}
Run Code Online (Sandbox Code Playgroud)

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

#include <map>

class MyObject
{ };

int main(void)
{
    typedef std::map<int, MyObject> MyMap;

    MyMap myMap;

    myMap.insert(MyMap::value_type(0, MyObject()));
}
Run Code Online (Sandbox Code Playgroud)

更小,几乎不可能得到内存泄漏.如果你确实需要存储指针,那么对于多态行为,请查看boost :: ptr_container库,它有一个存储指针映射适配器.