2010-12-10 4 views
2

Вот несколько примеров кода, иллюстрирующих проблему, с которой я сталкиваюсь.Проблема C++ Inheritance приводит к ошибке сегментации

#include <iostream> 

using namespace std; 

class Foo 
{ 
    public: 
     Foo(int x) 
     { m_x = x; } 
     int getX() 
     { return m_x; } 
    private: 
     int m_x; 
}; 

class Bar : public Foo 
{ 
    public: 
     Bar(int x) : Foo(x) 
     {} 
     //some other stuff 
}; 

int main() 
{ 
    Bar* bar = new Bar(5); 
    cout<<bar->getX()<<endl; 
    return 0; 
} 

У меня есть большой проект, над которым я работаю, и у меня подобная ситуация выше. Когда bar-> getX() вызывается, этот указатель равен 0x0, вызывая ошибку сегментации. Я попытался использовать функцию getX для класса Bar, но это не устраняет проблему, этот указатель по-прежнему равен 0x0. Есть идеи? Я понятия не имею, как Google для этого, только нашел людей, имеющих проблемы с виртуальными функциями.

ps. Этот образец работает.

EDIT:

std::cout<<m_engine<<std::endl; 
focus_x = m_engine->getX(); 

Выход: 0x2e6d763638667858 (не NULL), так что это не проблема ...

+2

Я просмотрел код, пытаясь найти проблему, а затем заметил ваш комментарий внизу об этом примере работы. Будет легче, если вы опубликуете код, который не работает, и мы сможем помочь вам разобраться с проблемой. – LeopardSkinPillBoxHat 2010-12-10 03:56:24

+0

это может произойти только в том случае, если «новый» сработает. И вы каким-то образом используете не метательную версию нового – Chubsdad 2010-12-10 04:00:00

+0

@Chubsdad - для «нового», чтобы сбой в приведенном выше примере, вам придется использовать компьютер с * очень * ограниченным Ресурсы. – LeopardSkinPillBoxHat 2010-12-10 04:01:09

ответ

1

Мое предположение, из вашего редактирования, заключается в том, что m_engine - это болтающийся указатель.

То есть, память, на которую указывает m_engine, была delete г. У вас все еще есть адрес, где память была, выделенная в m_engine, но когда вы пытаетесь получить доступ к этому адресу в памяти, ожидая действительного объекта Foo, Bar и т. Д., Эта часть памяти была восстановлена ​​оперативной система и другой объект, возможно, используют эту память.

Доступ к памяти, которая была освобождена, является неопределенным поведением в C++.

Предлагаю вам добавить контрольные точки в деструкторе m_engine (независимо от класса), чтобы увидеть, кто удаляет m_engine.

Другая возможность - повреждение памяти, но это намного сложнее диагностировать.

0

Когда this указатель 0x0, это означает, что вы назвали членом функции по указателю NULL. Вам придется проследить свой код и выяснить, как указатель объекта стал NULL. Недостаточно в вашем примере кода для диагностики проблемы.

Смежные вопросы