Сбой кода при хранении объектов в `std :: map` - PullRequest
1 голос
/ 11 августа 2009
 typedef std::map<int, MyObject*> MyMap;
 MyMap* myMap = new MyMap;
 // ...
 myMap->insert( MyMap::value_type( 0, objectOfType_MyObject ) );

Почему мой код падает с трассировкой стека до

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

?

Я понимаю, что если я использую пользовательский класс ключей, я должен предоставить компаратор, но это int.

Я никогда раньше не пользовался картами, и это, вероятно, глупый вопрос, но я застрял на нем целую вечность.

Спасибо

1 Ответ

11 голосов
/ 11 августа 2009

Этот код работает (компилируется и запускается) для меня:

#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()));
}

Намного меньше, и почти невозможно получить утечки памяти. Если вам do необходимо хранить указатели, для полиморфного поведения проверьте библиотеку boost :: ptr_container , которая имеет адаптер карты , в котором хранятся указатели .

...