«уничтожение» объекта означает, что его память восстановлена, и его содержимое может быть изменено (главным образом, если это произойдет от рукописного деструктора и, возможно, в результате хранения на месте вещей, связанных со свободной памятью). list :: erase возвращает вам новый итератор, который вы должны использовать вместо того, который был передан в качестве аргумента (я хотел бы сделать i = l.erase(i);
привычкой).
Ни в коем случае разрушение не подразумевает, что память очищается, стирается. Ранее действительные местоположения все еще действительны в большинстве случаев с точки зрения процессора (т. Е. Он может извлекать значения), но на них нельзя полагаться, потому что другая операция может перезапустить это местоположение для любой цели в любое время .
Маловероятно, что *i
выдаст segfault, imho - хотя это может произойти с более сложными типами, использующими указатели, но вы можете увидеть, что они имеют новые значения.
Другие коллекции могут иметь более предсказуемое поведение, чем список. IIrc, вектор будет сжимать область хранения, поэтому предыдущее значение будет видно только при дальнейшей разыменовке i
в редких случаях.