Выполнение функции-члена класса через указатель на абстрактный родительский класс указанного класса - PullRequest
0 голосов
/ 20 июля 2010

Я создал абстрактный базовый класс Animal, который имеет публичный виртуальный абстрактный метод makeSound().Я создал подкласс Cow, который реализует Animal.makeSound(), как и следовало ожидать (вы знаете ... "му").И у меня есть класс Farm, который содержит закрытую переменную-член std::vector<Animal*> animals.В одном из методов Farm я перебираю всех животных и заставляю их издавать звук.

for(unsigned int i = 0; i < animals.size(); i++)
{
   animals[i]->makeSound()
}

К сожалению, я получаю ошибку

Необработанное исключение в 0x65766974 в TestBed.exe: 0xC0000005: Место чтения нарушения доступа 0x65766974.

Есть идеи, что здесь происходит?


ОБНОВЛЕНИЕ: добавление дополнительного кода для запроса

class Farm
{
public:
    Farm();
    virtual ~Farm(void);

    void setBarnOnFire();

private:
    vector<Animal*> animals;
};


Farm::Farm()
{
    animals.push_back(new Dog());
    animals.push_back(new Cat());
    animals.push_back(new Chicken());
    animals.push_back(new Horse());
    animals.push_back(new Cow());
}



Farm::setBarnOnFire()
{
    for(unsigned int i = 0; i < animals.size(); i++)
    {
       animals[i]->makeSound()
    }
}

Есть ли что-то, что я должен сделать для инициализации animals.

РАЗРЕШЕНИЕ:

Так что вы все были правы.Я получал доступ к памяти, которой не владел.Но это заняло у меня целую вечность, чтобы выследить это.Это было связано с неправильным пониманием того, как происходит инициализация объекта.По сути, чтобы «инициализировать» переменную-член, я фактически перезаписывал ее локальной переменной.Затем я дал местным всем животным, которых я создал.Позже животные будут пытаться вызвать локальную переменную, которой больше не существует.

1 Ответ

0 голосов
/ 20 июля 2010

хорошо, позвольте мне сделать предположение:

"Необработанное исключение в 0x65766974 в TestBed.exe: 0xC0000005: Место чтения нарушения доступа 0x65766974."

похоже, что указатель кода находится в процессеотправлено на 0x65766974 («исключение на 0x65766974»), но это недопустимое место для чтения, не говоря уже о коде: («Место чтения нарушения доступа 0x65766974», обратите внимание, тот же номер)

, поэтому возможноуказатель vtable или vtable поврежден?возможно, объект перезаписывается строкой?поскольку он хранится в векторе, возможно, у вас есть что-то, переполняющее буфер (возможно, массив char?) в предыдущем объекте в векторе, и это повреждает указатель vtable следующего объекта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...