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