Frage zu New und Delete
-
Hallo Leute,
ich habe hier eine Klasse, die eine Member hat:
class matrix { // ... // Data of matrix std::vector<float> **m_oData; // ... }:
Der Konstruktor sieht so aus (aufgrund von zwei Variablen m_uWidth und m_uHeight:
m_oData = new std::vector<float>*[m_uWidth]; for (size_t i = 0; i < m_uWidth; i++) { m_oData[i] = new std::vector<float>(m_uHeight); }
Nun steht im Destruktor folgendes:
for (size_t i = 0; i < m_uWidth; i++) { delete m_oData[i]; } delete[] m_oData;
Frage: Ist das richtig? Oder reicht es aus, wenn ich schreibe:
delete[] m_oData;
?
-
Zu jedem new gehört ein delete!
Das Design vector** ist aber ziemlich fragwürdig.
-
Wieso? Wie würdest du das machen?
-
Schau dir an, was vector überhaupt ist. Aus deinem Code geht hervor, dass dir das vermutlich nicht ansatzweise klar ist.
-
Warum nicht einfach
std::vector<std::vector<float>> m_oData
Gefrickel mit Pointern kannst du dir in C++ meist sparen.
-
starki schrieb:
Wieso? Wie würdest du das machen?
std::vector<float> v(witdh*hight);
-
manni66 schrieb:
std::vector<float> v(witdh*hight);
Hi manni,
kurze Frage was ist das für ein Konstrukt?
Der Code würde mir einleuchten:std::vector<float> v;
Aber mir ist nicht ganz klar was deiner dort macht.
-
Irritiert schrieb:
kurze Frage was ist das für ein Konstrukt?
<a href= schrieb:
C++ Reference - std::vector">
explicit vector (size_type n); vector (size_type n, const value_type& val, const allocator_type& alloc = allocator_type());
Constructs a container with n elements. Each element is a copy of val (if provided).
Reicht das ?
-
DarkShadow44 schrieb:
Irritiert schrieb:
kurze Frage was ist das für ein Konstrukt?
<a href= schrieb:
C++ Reference - std::vector">
explicit vector (size_type n); vector (size_type n, const value_type& val, const allocator_type& alloc = allocator_type());
Constructs a container with n elements. Each element is a copy of val (if provided).
Reicht das ?
Nicht ganz.
Ist das ein reserve? Oder werden da nicht initialisierte Floats reingeworfen?
Nach der Beschreibung klingt das eher wie letzteres, das fände ich dann allerdings nicht so schön.
-
Das ist der Parameter für den Konstruktor, der die (anfängliche?) Größe angibt.
-
Constructs a container with n elements. Each element is a copy of val (if provided).
Erzeugt einen Container mit n Elementen. Jedes Element ist eine Kopie von
val
(falls vorhanden).
-
irrtiert schrieb:
Ist das ein reserve?
Nein
irrtiert schrieb:
Oder werden da nicht initialisierte Floats reingeworfen?
Nein
-
Arcoth schrieb:
Constructs a container with n elements. Each element is a copy of val (if provided).
Erzeugt einen Container mit n Elementen. Jedes Element ist eine Kopie von
val
(falls vorhanden).Ich glaube wir missverstehen uns.
Der Code von Manni hat kein val:
std::vector<float> v(witdh*hight);
und ruft doch diesen, Konstruktor auf, oder?
explicit vector (size_type n);
Das bedeutet "Erzeugt einen Container mit n Elementen." trifft zu.
Ich verstehe den Text so, dass er falls er val nicht hat "n" nicht initialisierte Floats in den Vector packt oder nicht?
Oder bedeutet der Text, dass er einfach nur die Kapazität des Vectors auf "n" erhöht und dies einfach nur eine Möglichkeit ist vec.reserve(); initial zu machen.
-
Ok, habe es gerade ausprobiert.
Es werden mit 0 initialisierte floats in den vector geworfen.
-
AFAIK wird einfach ein "leerer" float in den vector gepackt, also
0.0f
.irritiert schrieb:
Oder bedeutet der Text, dass er einfach nur die Kapazität des Vectors auf "n" erhöht und dies einfach nur eine Möglichkeit ist vec.reserve(); initial zu machen.
std::vector<float> v(witdh*hight); //alternativ std::vector<float> v; v.reserve(witdh*hight);
Ist einfach nur kürzer. Und gibt dir die Möglichkeit Elemente explizit zu initialisieren.
EDIT:
Sorry, muss natürlichstd::vector<float> v; v.resize(witdh*hight);
heißen, danke!
-
Ich verstehe den Text so, dass er falls er val nicht hat "n" nicht initialisierte Floats in den Vector packt oder nicht?
Ne, die werden sonst value-initialized - bei
float
s heißt das dass sie auf Null gesetzt werden.
-
@DarkShadow
std::vector<float> v(width*height);
und
std::vector<float> v; v.reserve(width*height);
sind nicht das gleiche. Der erste Schnipsel füllt den vector mit einer Anzahl von
floats
, der zweite Schnipsel reserviert lediglich den Speicher für eine Anzahl vonfloats
. Du meintest sicherresize()
.manni hat deinen Ansatz durch einen einfacheren ersetzt, der zudem auch noch deutlich robuster ist. Du möchtest eine mxn Matrix durch eine Klasse abbilden und möchtest dazu dynamisch Speicher anfordern. Zum ersten ist der Ansatz an sich nicht gut, weil er einige Besonderheiten mit sich bringt (Rule of 3/5), zum anderen setzt du deinen Ansatz auch noch falsch um.
Zur Anregung:
Wieviele Elemente hat eine 3x4 Matrix? Wenn du mit dem Element links oben anfängst und von dort zeilenweise nach rechts und unten nummerierst, kannst du da eine Gesetzmäßigkeit erkennen? Lässt sich das irgendwie ausnutzen?