【问题标题】:Code crash when storing objects in `std::map`在`std::map`中存储对象时代码崩溃
【发布时间】:2009-08-11 17:00:05
【问题描述】:
 typedef std::map<int, MyObject*> MyMap;
 MyMap* myMap = new MyMap;
 // ...
 myMap->insert( MyMap::value_type( 0, objectOfType_MyObject ) );

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

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

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

我以前从未使用过地图,这可能是一个愚蠢的问题,但我已经被这个问题困扰了很久了。

谢谢

【问题讨论】:

  • 堆栈跟踪是什么样的?
  • 提供完整的堆栈跟踪或使用 valgrind 来检测一些内存滥用 :-)
  • 可能是一个愚蠢的评论..但是你确定你没有在插入之前删除 myMap 对象吗?

标签: c++ stl map


【解决方案1】:

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

#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

【讨论】:

  • 很好的答案;在最后一种情况下,他可能还需要为 MyObject 定义一个复制构造函数。
  • 我的问题是我没有 .clear() 在初始化我的班级时使用地图。 (即使它的大小为 0)。我正在存储 Obj-C 对象
猜你喜欢
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 2023-03-27
  • 1970-01-01
  • 2011-05-10
相关资源
最近更新 更多