unique_ptr, qvector.resize () genera l’errore 2280 nel tentativo di fare riferimento a una funzione eliminata

Per evitare il creep dell’ambito (su una precedente Q ), ho isolato l’errore sopra riportato.

La mia definizione della class Voxel:

#ifndef VOXEL_H #define VOXEL_H #include  #include  #include  include  class Voxel : public QObject { Q_OBJECT public: Voxel(); ~Voxel(); }; #endif // VOXEL_H 

Il file principale che triggers l’errore:

 #include  int main(int argc, char *argv[]) { QVector < QVector <std::unique_ptr  > > cVoxel; cVoxel.resize(0); int rows = 80, cols = 80; for (int i = 0; i < rows; i++) { cVoxel[i].resize(cols); for (int j = 0; j < cols; j++) { cVoxel[i][j].reset(new Voxel); } } } 

La linea che alla fine lancia l’errore è:

 cVoxel[i].resize(cols); 

La traccia completa dell’errore: (che non dice che l’errore alla fine arriverà)

inserisci la descrizione dell'immagine qui

Ci sono altre domande ( che sono utili ) su questo errore ma non riesco a capire appieno come risolverlo. Sembrerebbe che qvector.resize() stia tentando di riallocare e probabilmente usando un costruttore di copie che poi lancia questo errore? Potrei liberare manualmente la memoria invece di usare la funzione di cui sopra, ma l’intero ideale dell’utilizzo di puntatori intelligenti è di evitare perdite di memoria … Ho iniziato a utilizzare unique_ptr per affrontare perdite sostanziali.


Sto usando QtCreator 4.4.0 e Qt 5.6.2, 64-bit.

— MODIFICARE —

Se sostituisco QVector con std::vector , cioè cVoxel viene creato come:

 std::vector < std::vector <std::unique_ptr  > > cVoxel; 

Quindi il programma si blocca nel ciclo for esterno, in:

 cVoxel[i].resize(cols); 

Il debug rivela che:

Debug Assertion non riuscito!

Programma: C: \ windows \ system32 \ MSVCP140D.dll File: C: \ Programmi (x86) \ Microsoft Visual Studio 14.0 \ VC \ INCLUDE \ vector Riga: 1234

Espressione: indice vettoriale fuori intervallo

Per informazioni su come il programma può causare un errore di asserzione, consultare la documentazione di Visual C ++ sugli asser.

Posso far funzionare il codice ridimensionando cVoxel a 80 anziché a 0. Ma sembra che ci sia una sottile differenza tra il modo in cui QVector.resize() e std::vector.resize() . Leggendo i documenti per ciascuno, sembravano identici.

unique_ptr non può essere copiato (solo spostato o spostato-assegnato):

La class ( unique_ptr ) soddisfa i requisiti di MoveConstructible e MoveAssignable, ma non i requisiti di CopyConstructible o CopyAssignable.

Il copy-constructor e il copy-assignment vengono cancellati in unique_ptr qui l’errore. La copia è implicitamente richiesta da cVoxel[i].resize(cols) . È ansible utilizzare QVector> in alternativa.

Un’altra cosa: chiamare cVoxel[i].resize(cols) dopo cVoxel.resize(0) è out-of-bounds. Probabilmente hai bisogno di cVoxel.resize(rows) .