使用指向对象实例的指针列表的访问冲突

Posted

技术标签:

【中文标题】使用指向对象实例的指针列表的访问冲突【英文标题】: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 扩展:***.com/questions/25234203/… 【参考方案1】:

感谢大家的参与。

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

【讨论】:

以上是关于使用指向对象实例的指针列表的访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

访问指向结构的指针会导致内存读取冲突

关于C++基类、派生类的引用和指针

JVM笔记5-对象的访问定位。

Swig:将成员变量(指向值的指针)转换为 python 列表

为什么在尝试将指向数组的指针作为函数的参数时出现访问冲突错误?

双链接列表上一个实例变量