【问题标题】:Always release a QSemaphore before deleting?总是在删除之前释放一个 QSemaphore?
【发布时间】:2012-01-31 11:05:44
【问题描述】:
  • 在删除之前是否需要释放 QSemaphore?

  • 如果是,我应该在delete semaphore之前调用semaphore->release(n),但是我怎么知道获得了多少(n)资源? (我知道available() 有多少资源,但不知道信号量的整体“大小”。)

我的问题的原因:我正在寻找内存泄漏并发现了一个造成内存泄漏的 QSemaphore,尽管(似乎已经)调用了 delete。可能是因为它没有正确释放 - The doc 说“警告:销毁正在使用的信号量可能会导致未定义的行为。”

编辑: 内存泄漏实际上是在所有对象被销毁之前放置的内存转储函数的结果。添加一个额外的范围{ ... } 对此有所帮助。尽管如此,我的问题仍然存在。

【问题讨论】:

  • 也许你应该改写一下。 “虽然调用了删除,但它没有被删除。”没有意义。当您对其调用 delete 时,该对象将被销毁。你的意思是它没有发布吗?
  • 我重新表述了我的问题。信号量显示在内存泄漏列表中 - 如果它实际上没有被删除,我不能说,只是它似乎没有被释放/删除正确

标签: c++ qt semaphore


【解决方案1】:

我认为您不需要在销毁之前释放信号量,因为release() 只是添加了指定数量的资源(又名许可) 到信号量。如果您查看 QSemaphore 的示例,您会发现 release() 可以将可用许可的数量增加到超过初始数量。

文档说的是,任何线程都不应操作正在销毁的信号量。换句话说,所有线程都应该完成它们对信号量对象方法的调用,不管它们是什么,然后才能安全地销毁它。并且类本身不支持这一点;通过外部方式确保这一点完全是应用程序的责任。实际上,在多线程编程中,销毁仍在使用的对象(甚至是同步对象)是不安全的,这是一种常见的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多