C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

vector - hinzufügen und löschen

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Mario Möller
Guest





PostPosted: Wed Sep 17, 2003 2:50 pm    Post subject: vector - hinzufügen und löschen Reply with quote



Hallo,

ich habe folgenden, vereinfachten Code:

<snip>
class MyClass {
int value;
//...
};

typedef vector<MyClass *> FirstVector;
typedef vector<MyClass *> SecondVector;

int main() {
FirstVector first;
SecondVector second;

for(int i=0; i<100; i++) {
MyClass *myClass = new MyClass();
myClass->value = foo();

if(i=0)
first.push_back(myClass);
else
second.push_back(myClass);

//Es werden die Werte der Klassen verglichen
compareValues(first, second);

//NUN MEIN PROBLEM!!!
//Ich möchte die Zeiger des ersten Vektors löschen und die
Vektoren vertauschen
FirstVector::iterator iter;
for(iter = first.begin(); iter != first.end(); iter++) {
delete iter;
}
first.swap(second);
}//for
}//main
</snip>

Es geht darum, Werte irgendwo auszulesen und die letzten beiden zu
vergleichen. Wenn ich das Programm laufen lasse, verbraucht es stetig
immer mehr Speicher (im Original sind es mehr als 100 Durchläufe).
Ich führe das darauf zurück, dass der allokierte Speicher nicht
freigegeben wird.

Dazu noch ein paar Fragen:
1. Nimmt 'iter' überhaupt den Datentyp an, der im Vektor steckt
(MyClass)?
2. Wie kann ich den allokierten Speicher, dessen Speicherstellen ja in
den Vektor abgelegt ist, löschen?

Danke
Mario

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Ludwig Pumberger
Guest





PostPosted: Wed Sep 17, 2003 4:34 pm    Post subject: Re: vector - hinzufügen und löschen Reply with quote



Mario Möller schrieb:

Quote:
snip
class MyClass {
int value;
//...
};

typedef vector<MyClass *> FirstVector;
typedef vector<MyClass *> SecondVector;

Warum MyClass * und nicht MyClass.

Quote:
int main() {
FirstVector first;
SecondVector second;

for(int i=0; i<100; i++) {
MyClass *myClass = new MyClass();

Warum new?

Quote:
myClass->value = foo();
if(i=0)
first.push_back(myClass);
else
second.push_back(myClass);

Das ist jetzt sehr unsicher. Welcher vector besitzt den Zeiger? Du musst
nun stetig aufpassen dass der Zeiger auch freigegeben wird (aber nicht
solange er noch im anderen Vektor liegt).

Quote:
//NUN MEIN PROBLEM!!!
//Ich möchte die Zeiger des ersten Vektors löschen und die
Vektoren vertauschen
FirstVector::iterator iter;
for(iter = first.begin(); iter != first.end(); iter++) {
delete iter;

Und schon hast du undefiniertes Verhalten. Da das scheinbar geht ist
std::vector<T>::iterator bei dir ein T *. In diesem Fall also ein MyClass
**. Das müsste heissen delete *iter; ABER nachdem der Zeiger auch im
zweiten vector liegt würde damit der andere vector auch ungültig.

first.clear(); müsste hier stehen wenn du die Zeiger gelöscht hast. Sonst
hast du einen Vector von Zeigern auf undefiniert.

Quote:
}
first.swap(second);

Und hier wird auch noch second undefiniert.

Quote:
Es geht darum, Werte irgendwo auszulesen und die letzten beiden zu
vergleichen. Wenn ich das Programm laufen lasse, verbraucht es stetig
immer mehr Speicher (im Original sind es mehr als 100 Durchläufe).
Ich führe das darauf zurück, dass der allokierte Speicher nicht
freigegeben wird.

Genau so ist es.

Quote:
Dazu noch ein paar Fragen:
1. Nimmt 'iter' überhaupt den Datentyp an, der im Vektor steckt
(MyClass)?

Nein iter ist ein Zeiger darauf. (Der Datentyp der im Vektor steckt ist
übrigens MyClass *)

Quote:
2. Wie kann ich den allokierten Speicher, dessen Speicherstellen ja in
den Vektor abgelegt ist, löschen?

Leg gar nicht erst Freispeicher an, und wenn dann verwende SmartPointer
(z.B. boost::shared_ptr [url]www.boost.org)[/url]. Noch besser wäre aber wenn du dich
erst mal eingehend mit std::vector beschäftigst und danach noch verstehen
lernst was Zeiger sind und wofür sie da sind.

Übrigens: Einfügen und Löschen(wie in deinem Subject steht) geht mit insert
und erase und nicht mit delete falls du das glaubst.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
André Pönitz
Guest





PostPosted: Wed Sep 17, 2003 5:18 pm    Post subject: Re: vector - hinzuf?gen und l?schen Reply with quote



Ludwig Pumberger <elpeka (AT) gmx (DOT) at> wrote:
Quote:
Mario Möller schrieb:

snip
class MyClass {
int value;
//...
};

typedef vector<MyClass *> FirstVector;
typedef vector<MyClass *> SecondVector;

Warum MyClass * und nicht MyClass.

int main() {
FirstVector first;
SecondVector second;

for(int i=0; i<100; i++) {
MyClass *myClass = new MyClass();

Warum new?

myClass->value = foo();
if(i=0)
first.push_back(myClass);
else
second.push_back(myClass);

Das ist jetzt sehr unsicher. Welcher vector besitzt den Zeiger?

Na der zweite. if (i=0) fuehrt immer den else-Zweig aus.

SCNR.

Andre'

--
Those who desire to give up Freedom in order to gain Security, will not have,
nor do they deserve, either one. (T. Jefferson or B. Franklin or both...)

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Ozan Ayyüce
Guest





PostPosted: Wed Sep 17, 2003 7:09 pm    Post subject: Re: vector - hinzufügen und löschen Reply with quote

Mario Möller:

Quote:
for(iter = first.begin(); iter != first.end(); iter++) {
delete iter;
}

iter ist ein Iterator der auf ein Element des vector zeigt. Wenn du auf
iter delete anwendest wird nicht das Element des vectors gelöscht, dafür
gibt es eine spezielle Methode. Um das Objekt selber zu löschen müsstest
du delete auf den Zeiger auf das Objekt anwenden, den du erhälst wenn du
iter mit *-Operator dereferenzierst:

for(iter = first.begin(); iter != first.end(); iter++) {
delete (*iter);
}

Nichtsdestotrotz finde ich deinen Stil unelegant.

Ozan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marco Keuthen
Guest





PostPosted: Thu Sep 18, 2003 8:05 am    Post subject: Re: vector - hinzufügen und löschen Reply with quote

Quote:
for(iter = first.begin(); iter != first.end(); iter++) {
delete (*iter);
}

Nichtsdestotrotz finde ich deinen Stil unelegant.

außerdem gefährlich!

Hier wird der Inhalt eines Vektorelements gelöscht, das Element bleibt aber bestehen. Das ist übel.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Ludwig Pumberger
Guest





PostPosted: Thu Sep 18, 2003 9:05 pm    Post subject: Re: vector - hinzufügen und löschen Reply with quote

Mario Möller schrieb:

Quote:
Warum MyClass * und nicht MyClass.

Warum new?

Weil ich seit langem kein C++ mehr gemacht habe, sondern nur Java. Da
muss jedes Objekt mit new erzeugt werden

Vergiss das erst mal ganz schnell wieder. New brauchst du in C++ eigentlich
nur wenn du Polymorphie willst.

Quote:
ABER nachdem der Zeiger auch im zweiten vector liegt würde damit der
andere vector auch ungültig.

Im zweiten Vektor liegt der andere Zeiger.

Entschuldige, ich hab das if irgendwie überlesen und first.push_back(..)
second.push_back(...) gelesen.

Quote:
first.clear(); müsste hier stehen wenn du die Zeiger gelöscht hast.
Sonst hast du einen Vector von Zeigern auf undefiniert.

Die Zeiger im ersten Vektor sind gelöscht. Wenn ich jetzt
'first.swap(second);' mache, wird doch der erste überschrieben (dachte
ich eigentlich). Oder nicht??

first ist nachher second und second first. Soll heissen second enthält
Zeiger mit denen du nichts machen darfst ausser ihnen einen Wert zuweisen.

Quote:

}
first.swap(second);

Und hier wird auch noch second undefiniert.

'second' wird dann noch gelöscht. Vergaß ich zu posten.

Mhm, du swapst also damit der Inhalt von first weggeworfen wird, jetzt
komme ich mit.


Quote:
Übrigens: Einfügen und Löschen(wie in deinem Subject steht) geht mit
insert und erase und nicht mit delete falls du das glaubst.

'erase' ruft IMHO 'clear' auf und hinzufügen geht doch auch mit
push_back. Oder ist insert der elegantere, empfohlene Weg?

clear ruft vielleicht erase auf, umgekehrt wäre etwas umständlich.
push_back(x) bedeutet dasselbe wie insert(end(), x) und ist zu 99% so
implementiert. Ich würde immer push_back nehmen weil es a) garantierte
konstante Effizienz hat und b) leichter verstanden wird.

Fazit: Wenn du new unbedingt brauchst dann nimm Smartpointer, damit
brauchst du dich um keine Freigaben mehr zu kümmern(erase/pop_back führt
dann zu delete). Ansonsten nimm einen vector<T> statt einem vector<T*>.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.