2016-04-07 11 views
-3

Настройки: Я пытаюсь работать с ImGUI, чтобы нарисовать gui на окнах, созданных с использованием SDL. Я написал функцию, называемую update, в которой он выполняет итерацию по forward_list извлекаемых объектов и рисует их, а затем я вызываю это в своем главном после событий опроса.Нарушение прав доступа с использованием списка указателей на экземпляры объектов

Код:

//vsc++11 
__interface IDrawable { void draw(ImDrawList * draw_list, ImVec2 margin = ImVec2 (20,20)); } 
class DrawableObj0 : public IDrawable { ...; public void draw (ImDrawList * draw_list, ImVec2 margin = ImVec2 (20,20)) { ...; }; ... } 
void update(forward_list<IDrawable *> * drawables) { 
    ...; 
    for (auto it = drawables->begin(); it != drawables->end(); ++it) 
     (*it)->draw(...); // Gets Access Violation Exception! 
    ...; 
} 

void main(...) { 
    forward_list<IDrawable *>* drawables = new forward_list<IDrawable *>(); 
    DrawableObj0** x = new DrawableObj0*[5]; 
    for (int i=0; i<5; i++){ 
     x[i] = new DrawableObj0(...); 
     drawables->push_front(x[i]); 
    } 
    ...; 
    update(drawables); 
    ...; 
} 

Проблема: Как я уже говорил в этом разделе кода я получаю нарушение доступа к памяти 0xc при попытке получить доступ к функции draw через итератор. Визуальная студия показывает, что ее можно решить с помощью фактической функции наблюдателя. Я также пробовал it._Ptr->_myVal->draw, но он имеет тот же результат и сбой при том же смещении памяти, что и код выше.

Отредактированный код благодаря @kfsone

+0

Вы подтвердили, что (* it) null или нет? Кроме того, сколько раз draw() вызывается перед сбоем? – joeking

+0

@joeking в наблюдателе, * он правильно ссылается на указатель объекта. Он сбрасывается с первой попытки. – Cunning

+0

Ваш список, вероятно, содержит оборванные указатели. Ошибка в коде, который вы заменили на '...'. Вам нужно будет отправить сообщение [MCVE] (http://stackoverflow.com/help/mcve) –

ответ

1

Спасибо всем за участие.

Похоже, что хотя мои сигнатуры метода были одинаковыми как в интерфейсе, так и в реализациях, параметры по умолчанию для параметров приводят к запутыванию вещей. Переменная типа реализованного класса считается самим интерфейсом, а во время выполнения (*it)->draw() ищет ссылку на метод в памяти, как если бы это был экземпляр IDrawable, а не DrawableObj0.