Я отлаживаю сбой, и я заметил, что на шаге через отладчик указатель this
меняет свое значение и после 3 шагов, наконец, получает значение 0x00000001, и приложение вылетает.
Теперь значение 0x00000001, очевидно, неверно, но действительно ли я должен ожидать, что значение this
изменится, когда я пройду через отладчик?
Ниже приведен конструктор, который я отлаживаю, где он падает. Я включил значение указателя this
в комментарии к каждому шагу, и, как вы можете видеть, оно немного прыгает.
CADOCommand::CADOCommand(CADODatabase* pAdoDatabase, CString strCommandText, int nCommandType)
{
m_pCommand = NULL;
m_pCommand.CreateInstance(__uuidof(Command)); // this = 0x515f9d10
m_strCommandText = strCommandText; // this = 0x2c0c0ee8
m_pCommand->CommandText = m_strCommandText.AllocSysString(); // this = 0x515f9d20
m_nCommandType = nCommandType; // this = 0x70847a55
m_pCommand->CommandType = (CommandTypeEnum)m_nCommandType; // this = 0x00000001
m_pCommand->ActiveConnection = pAdoDatabase->GetActiveConnection();
m_nRecordsAffected = 0;
}
Существуют ли какие-либо обстоятельства, при которых значение this
может или должно измениться по мере выполнения кода в данной функции-члене?
Обновить
Я должен добавить для записи и в ответ на несколько комментариев, я отлаживал выпускную сборку, но когда я отлаживал ту же функцию в отладочной сборке, значение this
в конце концов не изменилось.
Так что же это значит, проблема только в релизной сборке?
Комментарий @drescherjm получил одобрение, в котором говорится in release mode the this pointer is not correct because of optimization
, но что именно это означает под «неправильным»? Что мы не можем доверять указателю this в сборке релиза (это подделка) или что значение указателя правильное, но сборка релиза не работает из-за оптимизации?
this
никогда не должно изменять значение. Кажется, кто-то может переполнить буфер вCreateInstance
иAllocSysString
- person StoryTeller - Unslander Monica   schedule 23.08.2016this
кажется, что он находится в стеке, неправильное использование указателя (т.е. выполнение доступа за пределами границ) изменяет его. Кстати, а что такоеm_pCommand
? Какой-нибудь умный (или тупой) указатель? - person SergeyA   schedule 23.08.2016&this
. Он должен быстро поймать преступника. - person StoryTeller - Unslander Monica   schedule 23.08.2016this
? - person zar   schedule 23.08.2016