Настройки: Я пытаюсь работать с 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
Вы подтвердили, что (* it) null или нет? Кроме того, сколько раз draw() вызывается перед сбоем? – joeking
@joeking в наблюдателе, * он правильно ссылается на указатель объекта. Он сбрасывается с первой попытки. – Cunning
Ваш список, вероятно, содержит оборванные указатели. Ошибка в коде, который вы заменили на '...'. Вам нужно будет отправить сообщение [MCVE] (http://stackoverflow.com/help/mcve) –