2016-04-07 30 views
-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

+0

您是否验证(* it)是否为空?另外,draw()在崩溃前被调用了多少次? – joeking

+0

@joeking在观察者中,*它被正确引用到对象指针。它在第一次尝试时崩溃。 – Cunning

+0

您的列表可能包含悬挂指针。代码中的某处出现错误,您用'...'替换了代码。你需要发布[MCVE](http://stackoverflow.com/help/mcve) –

回答

1

谢谢大家的参与。

看来,尽管我的方法签名在界面和实现中都是相同的,但有参数的默认值会导致混乱。实现的类类型的变量被认为是接口本身,并且在运行时(*it)->draw()在内存中查找方法引用,就好像它是IDrawable而不是DrawableObj0的实例。