【问题标题】:*** glibc detected *** double free or corruption (fasttop):*** 检测到 glibc *** 双重释放或损坏(fasttop):
【发布时间】:2010-02-04 05:38:07
【问题描述】:

对 QByteArray 的 clear 调用会产生以下异常:

* 检测到 glibc * /home/yan/FPS2/FPS2: double free or corruption (fasttop):

0 ?? 1??
2 免费
3 QByteArray::clear()
4 FPSengine::getDatagrams
5 FPSengine::xmitData
6 FPSengine::getData
7 线程数据日志::运行
8 ??
9 start_thread
10 克隆
11 ?? 0

这是一个 qt 错误还是与我的代码有关?我知道 QObjects 不是线程安全的(QT 定义不是多个线程调用同一个对象实例的同一个函数),但我的函数有互斥锁。即使经常调用相同的函数,我也很少收到此错误。附言防止这种情况的一种方法是 env var MALLOC_CHECK_ 0

这个 url 涉及一个类似的问题,一些帖子似乎暗示它是由不兼容的 glibc 版本引起的。

*** glibc detected *** perl: double free or corruption (!prev): 0x0c2b7138 ***

【问题讨论】:

  • 您发布的最后三个问题似乎是线程之间不正确同步的症状。我不认为您的 FPSengine 类是线程安全的,但仍然没有足够的信息来提供答案。
  • 好吧,我只启用了一个 qthread 进行了测试,当然主线程总是在那里。主线程也没有做任何事情,从 qthread 调用的函数在第一条指令上具有互斥锁,在最后一条指令上解锁。从阅读 QByteArray.cpp 的代码和关于隐式共享类的 Qt 文档中可以看出,这似乎是一个取消引用问题。现在我想看看他是如何参与线程同步的

标签: multithreading qt glibc qthread


【解决方案1】:

这可能是许多不同的事情,包括引用由函数调用返回的临时 QByteArray,但它不太可能 (IMO) 成为 Qt 中的错误。

这里有一些关于调试的想法:

  • 在 Valgrind 下运行它,看看它是否会突出问题
  • 针对具有可用调试符号的 Qt 版本运行您的应用程序
  • 启用核心转储并查看是否获得核心文件

【讨论】:

    【解决方案2】:

    这是由于应用程序是多线程的,对象属于主线程但在另一个线程中使用,即使我在 QBytearray 上使用互斥锁,使用它来执行 readDatagram 的 UDPsocket 也在主线程中。 ..是的,我也需要那个 udpSocket 在主线程中

    【讨论】:

      【解决方案3】:

      我非常怀疑你在 qt 中发现了一个错误。发生该错误的原因有很多,但重要的是您引用了已释放的内存。运行调试器并尝试查看导致问题的原因。使用 gdb 和 valgrind,希望您能找到问题所在。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        相关资源
        最近更新 更多