Этот парень:VSC++, виртуальный метод при плохом адресе, любопытная ошибка
virtual phTreeClass* GetTreeClass() const { return (phTreeClass*)m_entity_class; }
При вызове, разбился программа с нарушением доступа, даже после полной перекомпиляции. Все функции-члены и виртуальные функции-члены имели правильные адреса памяти (я наводил курсор мыши на методы в режиме отладки), но у этой функции был неправильный адрес памяти: 0xfffffffc.
Все выглядело нормально: указатель «этот», и все работает нормально, пока эта функция не вызовет вызов. Эта функция также довольно старая, и я не менял ее в течение длительного времени. Проблема сразу же возникла после некоторой работы, и я прокомментировал все, чтобы увидеть, что делает это, без каких-либо успехов.
Так что я удалил виртуальный, скомпилированный, и он отлично работает. Я добавляю виртуальный, скомпилированный, и он все еще отлично работает! Я ничего не изменил и помню, что раньше делал полную перекомпиляцию и все еще имел ошибку.
Я не смог воспроизвести проблему. Но теперь он вернулся. Я ничего не изменил. Удаление виртуальных исправляет проблему.
В качестве краткого комментария вы должны действительно избегать использования приемов C-стиля при работе с иерархиями классов C++, особенно при работе с полиморфными классами. Есть слишком много возможностей для ошибок. –
Я сомневаюсь, что удаление «виртуального» исправлено «ничего». Неопределенное поведение непредсказуемо, возможно, оно даже работает, когда вы меняете что-то невиновное. Вам нужно будет сделать необходимую работу, чтобы воспроизвести это. Вероятно, вы нашли ошибку таким образом. Если нет, у вас есть хороший репродуктивный случай, чтобы показать здесь и попросить другие мнения. – sbi
Нам действительно нужно увидеть больше кода, чем это, чтобы быть полезным. Я имею в виду, откуда приходит m_entity_class? Какой тип? Какие функции влияют на него, и когда они называются, с какими вариантами использования? – Puppy