3

私は遊んでい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 回実行すると、2 番目のアプリは最初のアプリを検出するはずですが、検出されません。

編集 2: ここでバグを報告しましたhttps://bugreports.qt.io/browse/QTBUG-27744

4

2 に答える 2

2

これは間違いなくバグです。バグ レポートhttps://bugreports.qt.io/browse/QTBUG-27765をお読みください。

最近、これを修正するパッチを添付しました。これを修正したい場合は、投票する必要があります。

于 2013-03-31T11:31:56.540 に答える
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 のものは、その作成に依存する傾向があります。

編集:強調するために、上記は最初の実行でのみ発生します。後続の実行では、常に false-false が返されます。

Edit2: Windows では、結果は私にとっても true-true です。

Edit3: バグのようです。非常に多くのように聞こえます: https://bugreports.qt.io/browse/QTBUG-5123

于 2012-10-29T11:15:18.023 に答える