Я хочу вставить указатель на объект в карту. Правильно ли это?C++ map element inserting
object myobject[10];
....
mymap.insert(std::pair<int,object*>(pktctr, &myobject[pktctr]));
Я хочу вставить указатель на объект в карту. Правильно ли это?C++ map element inserting
object myobject[10];
....
mymap.insert(std::pair<int,object*>(pktctr, &myobject[pktctr]));
Является ли это правильный путь?
Да, хотя, возможно, лучше читать, если вы использовали make_pair
:
mymap.insert(std::make_pair(pktctr, &myobject[pktctr]));
или C++ 11 Синтаксис:
mymap.insert({pktctr, &myobject[pktctr]});
Единственная опасность заключается в том, что вы должны убедиться в том, что указатель удаляется или разрушается карта до того, как myobject
будет уничтожен (или, по крайней мере, убедитесь, что указатель никогда не используется после этого). В противном случае у вас будет висячий указатель и целый мир ошибок, ожидающих своего появления.
Является ли штраф, если я очищаю карту в деструкторе до того, как myobject будет уничтожен? –
@AvbAvb: Да: единственная опасность - если вы используете указатель * после *, объекты уничтожены. –
Это будет работать и быть правильными (т.е. не приводит к непредсказуемому поведению) до тех пор, как один из следующего трюма:
mymap
и myobject
имеют одинаковую продолжительность жизни (они были объявлены в той же области): вы будете уверены, что то, что карта переживет массивmyobject
жизни (вы бы и оборванный указатель тогда, указатель на то, что больше не существует)Убедитесь, что pktctr
никогда не попадают в конец массива.
Наконец, этот синтаксис также будет работать:
mymap[pktctr] = &myobject[pktctr];
EDIT:
На самом деле, я клиринговая карту в деструкторе, прежде чем MyObject будет уничтожен.
Тогда у вас не должно быть проблем с указателем поворота AFAIK.
Да, это правильный способ, если вы хотите проверить, что делает ваша платформа в случае неопределенного поведения. –
@ BЈовић: Где неопределенное поведение? Это выглядит хорошо для меня, пока 'pktctr' находится в диапазоне, и указатель удаляется до уничтожения myobject. Я что-то упускаю? –
@MikeSeymour Это много предположений :) Я предположил, что myobject находится в стеке в методе, и что он выходит из области видимости –