Windows中的QSharedMemory不一致行为

时间:2012-10-29 11:03:15

标签: c++ qt qt4 shared-memory

我正在玩QSharedMemory,我不确定我是否发现了一个严重的错误,或者我做错了什么。案例是文档说如果没有存在具有相同键的内存,则QSharedMemory::create()应该返回true,否则它应该返回false并且应该检查QSharedMemory::error()以查看发生了什么。

我目前的代码是:

QSharedMemory sm("smtest");
sm.setKey("smtest"); // <--- not needed as I already set the key in the initializator, but I'm leaving it anyways, just for the test
qDebug() << sm.create(1);
qDebug() << sm.create(1); //<--- I expect this to return false, but it returns true.
qDebug() << sm.error(); //<--. I expect this to return QSharedMemory::AlreadyExists, but QSharedMemory::NoError is returned instead.
//wtf?!

我的问题是:我刚刚在Qt4中发现了一个非常大的错误,或者我做错了什么?

PS:此代码在Windows 7 x64上运行

编辑:只是为了说清楚,如果我运行该代码两次,第二个应用程序应该检测第一个,但它没有。

编辑2:我在此报告了一个错误https://bugreports.qt.io/browse/QTBUG-27744

2 个答案:

答案 0 :(得分:2)

这绝对是一个错误,请阅读我的错误报告https://bugreports.qt.io/browse/QTBUG-27765

我最近附上了一个补丁来解决这个问题。如果你想修复这个问题,你需要投票。

答案 1 :(得分:1)

我只是在Linux上运行它:

#include <QCoreApplication>
#include <QSharedMemory>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSharedMemory sm("smtest");
    sm.setKey("smtest"); // <--- not needed as I already set the key in the initializator, but I'm leaving it anyways, just for the test
    qDebug() << sm.create(1);
    qDebug() << sm.create(1); //<--- I expect this to return false, but it returns true.
    qDebug() << sm.error(); //<--. I expect this to return QSharedMemory::AlreadyExists, but QSharedMemory::NoError is returned instead.
    //wtf?!
    return 0;
}

并且在第一次运行时得到了

true
false 
4 

可能是您没有创建QCoreApplication吗?很多Qt的东西往往取决于创建的东西。

编辑:要强调,以上只有在第一次运行时才会发生。后续运行总是给出假错误。

Edit2:在Windows上,结果对我来说也是真的。

Edit3:似乎是一个错误,听起来非常像这样:https://bugreports.qt.io/browse/QTBUG-5123