Следующее объяснение вопроса о названии в порядке, позвольте мне объяснить мой сценарий.Устранены ли адреса памяти в куче?
У меня есть контейнер списка указателей на несколько объектов в куче. Всякий раз, когда создается новый объект, указатель на него добавляется в список и всякий раз, когда объект удаляется, его указатель удаляется. Можно с уверенностью сказать, что все указатели в этом списке всегда действительны.
Многие объекты в списке содержат указатели на другие объекты в том же списке.
Перед тем, как разыменовать любой из этих указателей, я хотел бы использовать функцию CheckAgainstList(ptr*)
, чтобы убедиться, что один объект указывает на другой объект в том же списке и поэтому не указывает на объект, который с тех пор был удален.
Получите ваши шляпы tinfoil сейчас, это возможно?
- Объект А имеет указатель на объект B с адресом памяти
0x00988e50
. - Объект B удален.
- Объект C создан и помещается во вновь освобожденное пространство памяти
0x00988e50
. CheckAgainstList(ptr*)
возвращает true, когда мы проверяем указатель, потому что объект C находится в списке и находится в том же адресе памяти B, который использовался для занятия.
Теперь у нас есть ошибка, потому что A считает, что у нее указатель на B, но B ушел, и C занял свое место так сказать.
Возможна ли эта потенциальная ошибка?
Не просто возможно - его вероятность. Если вы освободите B и выделите C сразу после того, как это будет возможно с множеством реализаций кучи, вы получите тот же самый буфер обратно. –
Пришел сюда погулять по тому, как часто это происходит, после того, как куски памяти явно используются повторно (для данных того же типа). Так да :) – mlvljr