2012-02-29 13 views
5

これは本当にQtのバグのように感じます。誰でも解決策があるのですか、それともバグとして報告するべきですか?でも、それを使用する前にクラス 'QReadWriteLock'Errorで宣言されたプライベートメンバーにアクセスできないエラーC2248:' QReadWriteLock :: QReadWriteLock '

#include <QReadWriteLock> 

class FileInfoWrapper { 

public: 
    explicit FileInfoWrapper(const QFileInfo& _fileInfo); 
    ~FileInfoWrapper(); 

private: // also tried public 
    mutable QReadWriteLock lock_; 

、私はエラーが出る:それはプライベート/パブリックまたは何クラスIが含まれます場合

Error 1 error C2248: 'QReadWriteLock::QReadWriteLock' : cannot access private member declared in class 'QReadWriteLock'

は問題ではありません。私はスタック上に作成することができないようです。代わりに、私は「新しい」使用して、ヒープ上の1を作成したが、私は、コンストラクタで私のアプリケーションがクラッシュし、それを削除しようとすると:

Unhandled exception at 0x5090f39a (QtCored4.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfeeeff0e.

コールスタック:

QtCored4.dll!QHash::~QHash() Line 283 + 0xa bytes C++ QtCored4.dll!QReadWriteLockPrivate::~QReadWriteLockPrivate() + 0x38 bytes C++ QtCored4.dll!QReadWriteLockPrivate::`scalar deleting destructor'() + 0xf bytes C++ QtCored4.dll!QReadWriteLock::~QReadWriteLock() Line 137 + 0x1e bytes C++ CloudSync.exe!FileInfoWrapper::~FileInfoWrapper() Line 76 + 0x15 bytes C++

における変数「D」 QReadWriteLockPrivateは2回削除されたようです。しかし、これは別のクラスで動作します。ここでは、ヒープにロックを作成してから、コンストラクタでそのロックを削除する必要がありました。

Visual StudioでQt 4.8.0を実行しています。 Qt作成者4.7.4で同じ問題がありました。

+0

Qt 4.7.4、MinGW、Windows 7 x64で再生できません。 –

答えて

6

QReadWriteLockはコピーできません(Q_DISABLE_COPYを使用)ので、何らかの理由であなたのFileInfoWrapperオブジェクトをコピーしています(たとえば、コンテナに保管するなど)。
したがって、ポインタアドレスはそれらのコピー間で共有され、コピーごとに1回削除されます。

スマートポインタの内側にポインタをラップすることで、オブジェクトの最後のコピーが削除されたときにのみ削除が実行されます。

QSharedPointer<QReadWriteLock> lock_; 
+0

そのため、fileWrappersコンストラクタで削除する必要はありませんか?そして、はい、私はこれらのファイルのリストを持っていますが、私はまだ休息していません。私は理論上すべてのオブジェクトが共有するロックは1つしかないでしょうか?私がクラスを持っていて、それをスタック上で宣言したいクラスがある場合は、クラス内でQ_DISABLE_COPYマクロを使用できますか? – chikuba

+0

** 1。**はい、デストラクタで明示的に削除する必要はありません。 ** 2。**同じ 'FileInfoWrapper'オブジェクトのコピー間でロックが共有されます.2つの' FileInfoWrapper'オブジェクトをゼロから作成する場合(コンストラクタはQFileInfo'をとっていますが)、2つの独立したロックが存在します。 ** 3。**アプリケーション全体のクラスのインスタンスを1つだけ許可することを意味する場合は、代わりに "シングルトンパターン"を試してください。 – alexisdm

+0

私はFileInfoWrapperをコピーすることは決してありません。オブジェクトのインスタンスがたくさんあるだけです。しかし、私がリストの外にあるオブジェクトの1つを持っているなら、あなたは意味しますか?意味がない – chikuba

関連する問題