Ich arbeite mit einer Code-Basis, die schlecht geschrieben ist und eine Menge Speicherlecks hat.Ist es eine schlechte Idee, POD C-array mit std :: valarray zu ersetzen?
Es verwendet viele Strukturen, die rohe Zeiger enthalten, die meist als dynamische Arrays verwendet werden.
Obwohl die Strukturen oft zwischen Funktionen übergeben werden, sind die Zuweisung und Freigabe von diesen Zeigern an zufälligen Orten platziert und kann nicht leicht verfolgt/durchdacht/verstanden werden.
Ich habe einige von ihnen in Klassen und diese Zeiger geändert, um von den Klassen selbst behandelt zu werden. Sie funktionieren gut und sehen nicht sehr hässlich aus, abgesehen davon, dass ich die Kopierkonstrukt- und Kopierzuweisung dieser Klassen verboten habe, einfach weil ich keine Zeit damit verbringen möchte, sie zu implementieren.
Jetzt denke ich, erfinde ich das Rad neu? Warum ersetze ich C-array nicht durch std: array oder std :: valarray?
Ich würde std :: valarray bevorzugen, weil es Heap-Speicher und RAIIed verwendet. Und std :: array ist (noch) nicht in meiner Entwicklungsumgebung verfügbar.
Edit1: Ein weiteres Plus von std :: Array ist, dass die Mehrheit dieser dynamischen Arrays POD sind (meist int16_t, int32_t und Schwimmer) Arrays und die numerische API kann Möglichkeit das Leben leichter machen.
Gibt es etwas, auf das ich achten muss, bevor ich beginne?
Einer, den ich mir vorstellen kann ist, dass es nicht eine einfache Möglichkeit gibt, std :: valarray oder std :: array zurück in C-artige Arrays zu konvertieren, und ein Teil unseres Codes verwendet Zeigerarithmetik und Daten müssen sein präsentiert als einfache C-artige Arrays.
Sonst noch etwas?
EDIT 2
Ich kam in this question vor kurzem. Eine sehr schlechte Sache über std::valarray
ist, dass es bis C++ 11 nicht sicher kopierbar ist.
Wie in dieser Antwort in C++ 03 und früher zitiert, ist es UB, wenn Quelle und Ziel unterschiedlich groß sind.
Wenn ich es nicht vermisse, bin ich überrascht, dass 'std :: valarray' kein' .data() 'wie' std :: vector' enthält, das das zugrundeliegende rohe Array freigibt, wenn Sie ein C benötigen -Style-Array. – CoryKramer
Aus der Beschreibung, die Sie haben, scheint ein std :: vector geeignet zu sein. Gibt es etwas Bestimmtes, das dir die Beachtung von std :: valarray rechtfertigt? – nos
'std :: valarray' ist/war für LAPACKish-Anwendungen gedacht; Es ist selten benutzt und wahrscheinlich nicht gut hier. 'std :: vector' ist der übliche Container für dynamische Arrays, und Sie können einen Zeiger auf seine Daten mit' & vec [0] 'pre-C++ 11 erhalten (wenn' .data() 'noch nicht verfügbar war). – Wintermute