这真的感觉像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中有同样的问题.
您必须使用指针,因为QReadWriteLock
它不可复制(它使用Q_DISABLE_COPY
),并且您以某种方式复制FileInfoWrapper
对象(例如,通过将它们存储在容器中).
因此,指针地址在这些副本之间共享,并为每个副本删除一次.
您可以将指针包装在智能指针内,这样只有在删除对象的最后一个副本时才会删除.
QSharedPointer<QReadWriteLock> lock_;
Run Code Online (Sandbox Code Playgroud)