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à)
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)
.