2012-02-29 12 views
5

Esto realmente se siente como un error en Qt. ¿Alguien tiene una solución o debería presentarla como un error?No se puede acceder al miembro privado declarado en clase 'QReadWriteLock'Error error C2248:' QReadWriteLock :: QReadWriteLock '

#include <QReadWriteLock> 

class FileInfoWrapper { 

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

private: // also tried public 
    mutable QReadWriteLock lock_; 

Antes incluso de usarlo, me sale el error:

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

No importa si es privada/pública o qué clases que incluyen. Parece que no puedo crearlo en la pila. En lugar de ello he creado uno en el montón usando 'nuevo', pero cuando trato de eliminarlo en el constructor mis aplicación se bloquea con:

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

Pila de llamadas:

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++

La variable 'd' en QReadWriteLockPrivate parece ser eliminado dos veces. Sin embargo, esto funciona en otra clase donde también tuve que crear el bloqueo en el montón y luego eliminarlo en el constructor.

Ejecutando Qt 4.8.0 en Visual Studio. Tuve el mismo problema en el creador de Qt 4.7.4.

+0

No se puede reproducir con Qt 4.7.4, MinGW, Windows 7 x64. –

Respuesta

6

usted tiene que utilizar un puntero porque QReadWriteLock no es copiable (utiliza Q_DISABLE_COPY) y de alguna manera están copiando sus FileInfoWrapper objetos (almacenándolos en un recipiente, por ejemplo).
Por lo tanto, la dirección del puntero se comparte entre esas copias y se elimina una vez para cada copia.

Puede ajustar el puntero dentro de un puntero inteligente, de modo que la eliminación solo se produzca cuando se elimine la última copia de su objeto.

QSharedPointer<QReadWriteLock> lock_; 
+0

¿No es necesario eliminarlo en el constructor fileWrappers? Y sí, tengo una lista de estos archivos, pero todavía no estoy en barbecho. ¿Tendré en teoría solo un candado que todos los objetos compartan? Y si tengo una clase que solo tendré una y quiero declarar esto en la pila, ¿puedo usar la macro Q_DISABLE_COPY en mi clase? – chikuba

+0

** 1. ** Sí, ya no será necesario eliminarlo explícitamente en el destructor. ** 2. ** Los bloqueos se compartirán entre copias de los mismos objetos 'FileInfoWrapper', si crea 2 objetos' FileInfoWrapper' desde cero (aunque su constructor tome QFileInfo'), habrá 2 bloqueos independientes. ** 3. ** Si se refiere a permitir solo una instancia de una clase para toda la aplicación, debe intentar un "patrón singleton" en su lugar. – alexisdm

+0

Nunca copio el FileInfoWrapper, solo tengo muchas instancias del objeto. ¿Pero quieres decir si tengo uno de los objetos fuera de la lista? No tiene sentido – chikuba

Cuestiones relacionadas