【问题标题】:Access violation using list of pointers to object instances使用指向对象实例的指针列表的访问冲突
【发布时间】:2016-04-07 23:11:23
【问题描述】:

设置: 我正在尝试使用ImGUI 在使用 SDL 创建的窗口上绘制 gui。我编写了一个名为 update 的函数,它在其中迭代 forward_list 的可绘制对象并绘制它们,然后在轮询事件后在我的 main 中调用它。

代码:

//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);
    ...;
}

问题: 正如我在代码部分中提到的,我在尝试通过迭代器访问 draw 函数时遇到内存访问冲突 0xc。视觉工作室显示它可以解析为观察者中的实际功能。我也试过it._Ptr-&gt;_myVal-&gt;draw,但它的结果和上面的代码在相同的内存偏移处崩溃。

感谢@kfsone 编辑了代码

【问题讨论】:

  • 您是否验证过 (*it) 是否为空?另外,在崩溃之前 draw() 被调用了多少次?
  • @joeking 在观察者中,*它被正确地引用到对象指针。它在第一次尝试时崩溃。
  • 您的列表可能包含悬空指针。您替换为 ... 的代码中某处有错误。您需要发布MCVE
  • interface 何时添加到语言中? draw 是虚拟的吗? DrawableObj0 和 DrawableObj 有什么区别?
  • @kfsone interface 是一个 MSVC 扩展:stackoverflow.com/questions/25234203/…

标签: c++ pointers c++11 access-violation forward-list


【解决方案1】:

感谢大家的参与。

看起来虽然我的方法签名在接口和实现中都是相同的,但参数的默认值会导致事情变得混乱。实现的类类型的变量被认为是接口本身,在运行时(*it)-&gt;draw() 在内存中查找方法引用,就好像它是IDrawable 的实例而不是DrawableObj0

【讨论】:

    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 2014-03-16
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    相关资源
    最近更新 更多