Присвоение объектов кучи std :: map - PullRequest
1 голос
/ 21 июля 2011

Это происходит сбой во время выполнения.

std::map<std::string, MyClass> myMap;
myValue = new MyClass();
myMap["myKey"] = *myValue;

У меня есть 2 требования:

  1. что экземпляры MyClass хранятся в куче (отсюда использование new);
  2. Чтобы я мог ссылаться на них через ассоциативный массив (отсюда использование std :: Map).

Почему я не могу успешно использовать оператор разыменования в примере? Как я могу выполнить оба сразу?

PS. Я использую GCC.

Ответы [ 4 ]

5 голосов
/ 21 июля 2011

вы можете использовать это вместо этого, используя boost или tr1 shared_ptr:

std::map<std::string, shared_ptr< MyClass > > myMap;
myValue = shared_ptr< MyClass >( new MyClass() );
myMap["myKey"] = myValue;

нет проблем с владением, нет утечек памяти.

4 голосов
/ 21 июля 2011

Если вы потеряете область действия myValue, это утечка памяти.Так что лучше хранить MyClass* на вашей карте.

std::map<std::string, MyClass*> myMap;
myValue = new MyClass();
myMap["myKey"] = myValue;

В данном примере также убедитесь, что вы delete элемент, стирая или удаляя из map<>.Вы можете использовать умный указатель (например, boost::shared_ptr), если не хотите беспокоиться об управлении памятью.

Кроме того, из вашего приведенного примера я не знаю, почему он должен аварийно завершить работу при разыменовании *myClass.Вы делаете какие-то странные вещи в конструкторе копирования MyClass::MyClass(const MyClass&)?

1 голос
/ 21 июля 2011

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

В отличие от Java, в C ++ нет неявной ссылочной семантики;если вы хотите хранить указатели, вам нужно использовать std::map<std::string, MyClass*> и соответственно управлять управлением памятью или, как сказал Стийн, использовать для этого какую-то форму shared_prt.

0 голосов
/ 21 июля 2011

Вы создаете новый объект в строке 2 и / копируете / его в карту. Вы, вероятно, ищете повышение :: ptr_map.

...