【问题标题】:Qt5Cored!Qobject::disconnect... read access violation at 0x0Qt5Cored!Qobject::disconnect... 在 0x0 处读取访问冲突
【发布时间】:2014-03-01 09:32:29
【问题描述】:

以下内容描述了该问题以及我为“纠正”它们所做的工作。此运行时事件需要几个小时才能解决。由于该网站是我最喜欢的信息来源之一,因此认为这可能会使某人受益。

我确定这个异常是我对 QObjectCleanupHandler 的误解造成的。任何关于 QObjectCleanupHandler 实际实现的建设性 cmet 将不胜感激。

-- 将带有 QPointer 的 QObjectCleanupHandler 添加到 MDI 子窗口和工作类。

  • 运行调试应用程序。

在运行结束时:

弹出一个对话框,其中包含似乎是程序集堆栈数据的内容。

在 QT Creator 菜单中查看调试日志:Windows\Views\Debugger Log\

日志片段:

移到底部

::::

片段:

移到底部

dState 从 InferiorRunRequested(10) 更改为 InferiorRunOk(11) [大师] (1d84.1720):访问冲突 - 代码 c0000005(第一次机会) s sException at 0x67343a9c,代码:0xc0000005:读取访问冲突 at: 0x0, flags=0x0 (第一次机会) at c:\work\build\qt5_workdir\w\s\qtbase\src\corelib\kernel\qobject.cpp:2813 在任何异常处理之前报告第一次机会异常。 可以预期并处理此异常。 eax=03f160f1 ebx=00000000 ecx=03f3b728 edx=feeefeee esi=00000005 edi=00000000 eip=67343a9c esp=0046d1b8 ebp=0046d340 iopl=0 nv up ei pl nz na po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b
efl=00010202 Qt5Cored!QObject::disconnect+0x2bc: 2813 67343a9c 8b02 mov eax,dword ptr [edx] ds:002b:feeefeee=???????? s 异常在 0x67343a9c,代码:0xc0000005:读取访问冲突:0x0,标志=0x0 (第一次机会) dNOTE:下自发停止停止。状态 从 InferiorRunOk(11) 更改为 InferiorStopOk(14) [master] 解析符号:Qt5Cored!QObject::disconnect...


负责异常的源代码片段:

QThread *thread = new QThread;
QPointer<vcSharedDataQt> worker = new vcSharedDataQt();
trackObject(worker);
worker->movetothread(thread); 

trackObject() 方法是 QMdiSubWindow 上的私有字段

class <form> 
{

 private:

   QObjectCleanupHandler trackObject(QObject obj);


::: etc.

纠正措施:

源代码片段更改为:

QThread *thread = new QThread;
QPointer<vcSharedDataQt> worker = new vcSharedDataQt();
worker->movetothread(thread); 

/* 删除了所有类中的所有 QObjectCleanupHandler 实例。 */

异常中定义的 QT 环境:QT KernelBase!RaiseException at 0x759fc41f


【问题讨论】:

  • 如果您的应用程序没有更多上下文并分析正在发生的事情,那么它的用处有限。对我来说,崩溃的实际原因可能是 worker 是从两个没有保护的线程访问的,从它操作的新线程和带有清理处理程序的(主)线程。现在看起来你正在泄漏线程和工作线程,所以我不确定问题是否得到妥善解决。
  • 我认为您的评估是正确的。我将进一步研究线程资源的锁定,因为指针被插入到所有活动线程的 QList> 中,并且只有在将 finalize 发送回主线程之后,QThread 对象才会从 QList 中删除。也许我需要在线程被添加到指针列表时实现一个锁。我会看看它。感谢您的评论。

标签: c++ qt exception memory-management qt-creator


【解决方案1】:

我曾经遇到过同样的问题,结果我不得不重新启动 QtCreator。再次加载我的项目后,没有更改我的代码中的任何内容,我不再收到该错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多