无法访问类'QReadWriteLock'Error中声明的私有成员1错误C2248:'QReadWriteLock :: QReadWriteLock'

chi*_*uba 5 c++ qt mutex

这真的感觉像Qt中的一个错误.任何人都有解决方案或我应该将其归档为错误?

#include <QReadWriteLock>

class FileInfoWrapper {

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

private: // also tried public
    mutable QReadWriteLock lock_;
Run Code Online (Sandbox Code Playgroud)

在使用它之前,我收到错误:

错误1错误C2248:'QReadWriteLock :: QReadWriteLock':无法访问类'QReadWriteLock'中声明的私有成员

如果它是私人/公共或我包括哪些类别无关紧要.我似乎无法在堆栈上创建它.相反,我使用'new'在堆上创建了一个,但是当我尝试在构造函数中删除它时,我的应用程序崩溃了:

MyApp.exe中0x5090f39a(QtCored4.dll)的未处理异常:0xC0000005:访问冲突读取位置0xfeeeff0e.

调用堆栈:

QtCored4.dll!QHash ::〜QHash()第283行+ 0xa字节C++ QtCored4.dll!QReadWriteLockPrivate :: ~QQeadWriteLockPrivate()+ 0x38字节C++ QtCored4.dll!QReadWriteLockPrivate ::`标量删除析构函数'()+ 0xf字节C++ QtCored4.dll!QReadWriteLock :: ~QQeadWriteLock()第137行+ 0x1e字节C++ CloudSync.exe!FileInfoWrapper :: ~FileInfoWrapper()第76行+ 0x15字节C++

QReadWriteLockPrivate中的变量"d"似乎被删除了两次.但是,这适用于另一个类,我还必须在堆上创建锁,然后在构造函数中删除它.

在Visual Studio中运行Qt 4.8.0.在Qt creator 4.7.4中有同样的问题.

ale*_*sdm 6

您必须使用指针,因为QReadWriteLock它不可复制(它使用Q_DISABLE_COPY),并且您以某种方式复制FileInfoWrapper对象(例如,通过将它们存储在容器中).
因此,指针地址在这些副本之间共享,并为每个副本删除一次.

您可以将指针包装在智能指针内,这样只有在删除对象的最后一个副本时才会删除.

QSharedPointer<QReadWriteLock> lock_;
Run Code Online (Sandbox Code Playgroud)