Sie können keinem int*
eine std::unique_ptr<int[]>
zuweisen, das ist die Ursache für Ihren Fehler. Der richtige Code ist
Allerdings ist piokuc korrekt, dass es sehr ungewöhnlich ist, unique_ptr
für Arrays zu verwenden, denn std::vector
und std::array
sind dafür gedacht, abhängig davon, ob die Größe im Voraus bekannt ist.
All diese können genauso wie der Code, den Sie bereits hatten, initialisiert und verwendet werden, außer dass sie einfacher zu konstruieren sind und Sie sie nicht zerstören müssen.
Wenn Sie nicht den Luxus haben, ein std::array
oder ein std::vector
anstelle eines dynamisch zugewiesenen Arrays zu verwenden, können Sie ein unique_ptr
für ein zweidimensionales Array in C ++ 11 wie folgt verwenden:
Die Deklaration unique_ptr
sorgt dafür, dass die Dimension Zeile des Arrays zugewiesen wird. Das abschließende ()
in new int*[10]()
stellt sicher, dass jeder Spaltenzeiger auf nullptr
initialisiert wird.
Eine for-Schleife weist dann die Spalten-Arrays zu:
%Vor% Wenn der unique_ptr
den Gültigkeitsbereich verlässt, sorgt seine benutzerdefinierte Lösch-Lambda-Funktion dafür, dass die Spalten-Arrays gelöscht werden, bevor das Zeilen-Array gelöscht wird. Der for_each
Ausdruck verwendet den default_delete Funktor.
Ihr Code manipuliert effektiv ein Array von Arrays mit int.
In C ++ möchten Sie es normalerweise wie folgt implementieren:
%Vor%Dies ist kein guter Fall für unique_ptr. Außerdem sollten Sie keine Zeiger auf unique_ptr verwenden und unique_ptr-Objekte dynamisch zuweisen. Der einzige Punkt von unique_ptr ist die Eliminierung der Verwendung von Zeigern und die automatische Zuweisung und Freigabe von Objekten.
Die einzigen Gründe, warum ich denken kann, std :: unique_ptr (oder sagen boost :: scoped_array) über std :: vector zum Halten von Arrays zu verwenden, sind normalerweise nicht anwendbar ...
1) Es speichert 1 oder 2 Zeiger im Wert von Speicher, abhängig davon, ob Sie wissen, wie groß die Größe aller Arrays ist [irrelevant, es sei denn, Sie haben eine massive Anzahl sehr kleiner Arrays]
2) Für den Fall, dass Sie das Array nur in eine Funktion übergeben, die ein C-Stil-Array oder einen rohen Zeiger erwartet, könnte es sich als natürlicher anfühlen. std :: vector ist jedoch garantiert sequentiell gespeichert, also ist es auch 100% ig, (a.empty() ? nullptr : &a[0], a.size())
in eine solche Funktion zu übergeben.
3) Standardcontainer im MSVC-Debug-Modus sind standardmäßig "aktiviert" und sehr langsam, was beim wissenschaftlichen Programmieren auf großen Datensätzen ärgerlich sein kann.
Ein Beispiel weiter oben inspirierte mich für diese Lösung
%Vor%Hier können alle Dimensionen dynamisch sein und Sie können sie in eine Klasse einfügen und einen Operator [] anzeigen. Außerdem wird der Speicher zusammenhängend zugeordnet und Sie können leicht einen Zuordner eingeben, der ausgerichteten Speicher zuordnet.
Tags und Links c++ c++11 unique-ptr