使用指向对象实例的指针列表的访问冲突
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->_myVal->draw
,但它的结果和上面的代码在相同的内存偏移处崩溃。
感谢@kfsone 编辑了代码
【问题讨论】:
您是否验证过 (*it) 是否为空?另外,在崩溃之前 draw() 被调用了多少次? @joeking 在观察者中,*它被正确地引用到对象指针。它在第一次尝试时崩溃。 您的列表可能包含悬空指针。您替换为...
的代码中某处有错误。您需要发布MCVE
interface
何时添加到语言中? draw
是虚拟的吗? DrawableObj0 和 DrawableObj 有什么区别?
@kfsone interface
是一个 MSVC 扩展:***.com/questions/25234203/…
【参考方案1】:
感谢大家的参与。
看起来虽然我的方法签名在接口和实现中都是相同的,但参数的默认值会导致事情变得混乱。实现的类类型的变量被认为是接口本身,在运行时(*it)->draw()
在内存中查找方法引用,就好像它是IDrawable
的实例而不是DrawableObj0
。
【讨论】:
以上是关于使用指向对象实例的指针列表的访问冲突的主要内容,如果未能解决你的问题,请参考以下文章
Swig:将成员变量(指向值的指针)转换为 python 列表