2013-09-26 3 views
0

Я хочу вставить указатель на объект в карту. Правильно ли это?C++ map element inserting

object myobject[10]; 
.... 
mymap.insert(std::pair<int,object*>(pktctr, &myobject[pktctr])); 
+1

Да, это правильный способ, если вы хотите проверить, что делает ваша платформа в случае неопределенного поведения. –

+4

@ BЈовић: Где неопределенное поведение? Это выглядит хорошо для меня, пока 'pktctr' находится в диапазоне, и указатель удаляется до уничтожения myobject. Я что-то упускаю? –

+0

@MikeSeymour Это много предположений :) Я предположил, что myobject находится в стеке в методе, и что он выходит из области видимости –

ответ

2

Является ли это правильный путь?

Да, хотя, возможно, лучше читать, если вы использовали make_pair:

mymap.insert(std::make_pair(pktctr, &myobject[pktctr])); 

или C++ 11 Синтаксис:

mymap.insert({pktctr, &myobject[pktctr]}); 

Единственная опасность заключается в том, что вы должны убедиться в том, что указатель удаляется или разрушается карта до того, как myobject будет уничтожен (или, по крайней мере, убедитесь, что указатель никогда не используется после этого). В противном случае у вас будет висячий указатель и целый мир ошибок, ожидающих своего появления.

+0

Является ли штраф, если я очищаю карту в деструкторе до того, как myobject будет уничтожен? –

+0

@AvbAvb: Да: единственная опасность - если вы используете указатель * после *, объекты уничтожены. –

2

Это будет работать и быть правильными (т.е. не приводит к непредсказуемому поведению) до тех пор, как один из следующего трюма:

  • mymap и myobject имеют одинаковую продолжительность жизни (они были объявлены в той же области): вы будете уверены, что то, что карта переживет массив
  • указателя удаляется до конца myobject жизни (вы бы и оборванный указатель тогда, указатель на то, что больше не существует)

Убедитесь, что pktctr никогда не попадают в конец массива.

Наконец, этот синтаксис также будет работать:

mymap[pktctr] = &myobject[pktctr]; 

EDIT:

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

Тогда у вас не должно быть проблем с указателем поворота AFAIK.