这真的感觉像是Qt中的一个错误。任何人都有解决方案或我应该将其归档为错误?
#include <QReadWriteLock>
class FileInfoWrapper {
public:
explicit FileInfoWrapper(const QFileInfo& _fileInfo);
~FileInfoWrapper();
private: // also tried public
mutable QReadWriteLock lock_;
在使用之前,我收到错误:
错误1错误C2248:'QReadWriteLock :: QReadWriteLock':无法访问类'QReadWriteLock'中声明的私有成员
无论是私人/公共还是我包含哪些类别都无关紧要。我似乎无法在堆栈上创建它。相反,我使用'new'在堆上创建了一个,但是当我尝试在构造函数中删除它时,我的应用程序崩溃了:
MyApp.exe中0x5090f39a(QtCored4.dll)的未处理异常:0xC0000005:访问冲突读取位置0xfeeeff0e。
调用堆栈:
QtCored4.dll!QHash :: ~QHash()第283行+ 0xa字节C ++ QtCored4.dll!QReadWriteLockPrivate :: ~QReadWriteLockPrivate()+ 0x38字节C ++ QtCored4.dll!QReadWriteLockPrivate ::`标量删除析构函数'()+ 0xf字节C ++ QtCored4.dll!QReadWriteLock :: ~QReadWriteLock()第137行+ 0x1e字节C ++ CloudSync.exe!FileInfoWrapper :: ~FileInfoWrapper()第76行+ 0x15字节C ++
QReadWriteLockPrivate中的变量'd'似乎被删除了两次。但是,这适用于另一个类,我还必须在堆上创建锁,然后在构造函数中删除它。
在Visual Studio中运行Qt 4.8.0。在Qt creator 4.7.4中有同样的问题。
答案 0 :(得分:6)
您必须使用指针,因为QReadWriteLock
不可复制(它使用Q_DISABLE_COPY
)并且您以某种方式复制FileInfoWrapper
对象(例如,将它们存储在容器中)。
因此,指针地址在这些副本之间共享,并为每个副本删除一次。
您可以将指针包装在智能指针内,这样只有在删除对象的最后一个副本时才会删除。
QSharedPointer<QReadWriteLock> lock_;