У меня есть указатель на данный класс. Скажем, например, указатель:
0x24083094
Указатель указывает на:
0x03ac9184
Какая таблица виртуальных функций моего класса. Это имеет смысл для меня. В windbg все выглядит правильно.
Я удаляю указанный указатель. Сейчас на 0x24083094
стоит:
0x604751f8
Но это не какой-то случайный мусор, этот адрес вставляется туда каждый раз, это последовательно 0x604751f8
! Настолько, что я действительно могу использовать этот адрес, чтобы определить, был ли этот указатель удален между выполнениями моего приложения!
Но почему? Как он определяет, что 0x604751f8
должно быть написано там?
Для справки, я использую окна, построенные под visual studio 2003.
Я знаю, что не могу полагаться на то, что это значение установлено, даже если оно выглядит согласованным, но могу ли я рассчитывать на то, что оно будет другим? Т.е., 0x03ac9184
не будет в 0x24083094
, если указатель удален, верно? Что там положено? Это может быть что угодно, но 0x03ac9184
определенно не будет (или я мог бы по-прежнему вызывать методы, поскольку это таблица виртуальных функций). Я прав?
Я чувствую, что у меня есть ответ. не может полагаться ни на что после того, как оно удалено. Может быть, какой-то опыт поможет людям понять, откуда я. По сути, я пытаюсь исправить ошибку, когда указатель удаляется из-под меня. Это длинная история, я не буду вдаваться в подробности.
По сути, я пытаюсь определить, что я нахожусь в этой ситуации, поэтому я могу элегантно выйти из своей функции. Я полагаю, что самый простой и лучший способ - просто выяснить, кому на самом деле принадлежит этот указатель, и спросить его, изменилось ли что-нибудь. Так что я собираюсь реализовать такое исправление. Он избегает любого из этих C ++ delete hacker-y, которые я обсуждал.
Однако , интересно то, что в нашем коде у нас есть класс BogusObject, который, по сути, действует как трей, ловящий людей, которые случайно разыменовывают освобожденные объекты. По сути, мы подключаем наши собственные функции удаления и помещаем класс BogusObject в виртуальную таблицу любого освобожденного класса.
Тогда, если кто-то что-то называет, он получает приятное сообщение, в котором говорится что-то вроде «эй, что-то не так, чувак». Это происходит в моем случае. То есть 0x604751f8+(someoffset)
находится внутри класса BogusObject. Но мы больше не используем BogusObject! Он буквально нигде не настроен (даже ссылки должным образом, если я полностью удаляю класс BogusObject), и все же я получаю хорошее сообщение о том, что что-то не так! Но я сейчас придерживаюсь мнения, что это совпадение.
По какой-то причине среда выполнения помещает это значение 0x604751f8
в этот указатель при его удалении, и это просто соответствует одному классу, который имеет целью перехватывать подобные ситуации!