2015-07-11 6 views
1

У меня есть unordered_map объектов. Каждый объект, в своем деструкторе, просматривает неупорядоченную карту, чтобы найти другие объекты, а затем настраивает эти другие объекты. Это не удастся, если другие объекты являются объектами зомби, но если другие объекты полностью удалены из unordered_map, проблем нет.Порядок уничтожения в unordered_map

Мои вопросы:

  1. делает эту работу, если я стираю() объект, и его деструктор пытается искать себя в неупорядоченном карте? В частности, первый вызванный деструктор или первый объект, удаленный из неупорядоченного_мапа, или нет гарантии?
  2. это работает, если unordered_map уничтожен? В частности, будет ли unordered_map находиться в правильном состоянии, когда вызывается каждый отдельный деструктор?
+5

Просто не делайте этого? –

+1

Просто проверьте это с некоторыми заявлениями о печати? –

+1

стирает только аннулирует свой собственный итератор, но я не думаю, что вы можете предположить, что вы можете найти свое «я» на карте после вызова деструктора.Также не предполагайте, что если вы протестируете и работаете с одной реализацией, он будет работать с другой реализацией стандартной библиотеки. Как сказал @KerrekSB - Не делай этого –

ответ

3

Время жизни объекта типа Т заканчивается, когда [...], если Т представляет собой тип класса с нетривиальным деструктором (12.4), начинается деструктор вызова [...]

[§ 3,8/1 N4431]

И далее вниз

свойства, приписываемые объектам на протяжении всего этого международного стандарта применяются для данного объекта только ди кольцо ее жизни

[§ 3.8/3 N4431]

И, наконец,

[...] после того, как время жизни объекта закончилась [...] любой указатель, который ссылается к месту хранения, в котором будет находиться или находится объект, может использоваться только ограниченным образом. [...] Программа имеет неопределенное поведение, если [...] указатель используется для доступа к нестатическому элементу данных или вызывает нестационарную функцию-член объекта [...]

[§ 3,8/5 N4431]

так, так как вы должны иметь какой-то справки (например, указатель или реальную ссылку, которую я бы рассчитывать как указатель здесь, тоже) на карте, и его срок службы имеет (например, для получения итератора) будет - насколько я прочитал эту часть стандарта - приведет к неопределенному поведению.

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

Итак: Не делайте этого. Ни с неупорядоченными контейнерами, ни с каким-либо другим объектом.


BTW: Какой щипания имеет смысл, когда вы это делаете на объекты, которые будут в дальнейшем моменты разрушенных?

+0

Спасибо, стандарт - это то, на что я надеялся. Тонкая настройка объекта, который скоро будет убит, важен, когда его деструктор имеет побочные эффекты (например, если он собирает мусор). –

Смежные вопросы