-3
设置: 我试图使用ImGUI
在使用SDL创建的窗口上绘制gui。我写了一个名为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)是否为空?另外,draw()在崩溃前被调用了多少次? – joeking
@joeking在观察者中,*它被正确引用到对象指针。它在第一次尝试时崩溃。 – Cunning
您的列表可能包含悬挂指针。代码中的某处出现错误,您用'...'替换了代码。你需要发布[MCVE](http://stackoverflow.com/help/mcve) –