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> elemente anhängen

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
André Schmidt
Guest





PostPosted: Thu Jun 03, 2004 12:26 pm    Post subject: <vector> elemente anhängen Reply with quote



Hallo,
ich habe folgendes Problem:
Habe einen Vector

std::vector<CAudioBuffer> m_vBuffers;

deklariert un dmöchte nun elemente anhängen.
Das klappt auch wunderbar mit folgendem code:

CAudioBuffer *pBuffer = new CAudioBuffer(strFile);
m_vBuffers.push_back(*pBuffer);

Dummerweise werden im Konstruktor eines CAudioBuffer funktionen aus
einer fremdl-libary (OpenAL) aufgerufen die einen buffer erzeugen und im
Destruktor Funktionen aufgerufen die diesen Buffer wieder zerstören.

Ich habe nun bemerkt das push_back beim erweitern des vectors elemente
kopiert und auch elemente gelöscht werden. Dies führt dazu das meine von
der Libary erzeugten Buffer invalid werden.

Die einfachste aber nich sehr elegante lösung die ich jetzt habe ist,
dass ich eine funktion Destroy definiere in der die Buffers gelöscht
werden und im Destruktor im Prinzip nichts passiert.

Wie wäre es wenn ich nur Zeiger auf CAudioBuffer verwende?
zB.
std::vector<CAudioBuffer*> m_vpBuffers;

Hat jemand eine bessere Lösung? Ich arbeite noch nicht lang mit std
deswegen bitte ich um nachsicht falls ich was offensichtliches übershen
habe :-)

Grüße,
André
--
J.A.E.L.C. - Just another Elite(tm) clone
http://www.szintec.de/software/jaelc/JAELC.php

--
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
Karl Heinz Buchegger
Guest





PostPosted: Thu Jun 03, 2004 3:44 pm    Post subject: Re: <vector> elemente anhängen Reply with quote



André Schmidt wrote:
Quote:

Hallo,
ich habe folgendes Problem:
Habe einen Vector

std::vector<CAudioBuffer> m_vBuffers;

deklariert un dmöchte nun elemente anhängen.
Das klappt auch wunderbar mit folgendem code:

CAudioBuffer *pBuffer = new CAudioBuffer(strFile);
m_vBuffers.push_back(*pBuffer);

Dummerweise werden im Konstruktor eines CAudioBuffer funktionen aus
einer fremdl-libary (OpenAL) aufgerufen die einen buffer erzeugen und im
Destruktor Funktionen aufgerufen die diesen Buffer wieder zerstören.

Ich habe nun bemerkt das push_back beim erweitern des vectors elemente
kopiert und auch elemente gelöscht werden. Dies führt dazu das meine von
der Libary erzeugten Buffer invalid werden.

Die einfachste aber nich sehr elegante lösung die ich jetzt habe ist,
dass ich eine funktion Destroy definiere in der die Buffers gelöscht
werden und im Destruktor im Prinzip nichts passiert.

Wie wäre es wenn ich nur Zeiger auf CAudioBuffer verwende?
zB.
std::vector<CAudioBuffer*> m_vpBuffers;

Hat jemand eine bessere Lösung? Ich arbeite noch nicht lang mit std
deswegen bitte ich um nachsicht falls ich was offensichtliches übershen
habe Smile

Im std gibt es auch keine vernuenftige Loesung dafuer. Die Loesung
mit dem Pointer Vektor ist prinzipiell schon ok, nur solltest Du
nicht Pointer direkt im Vektor speichern (ausser Du willst Dir
einen Rattenschwanz an Problemen einhandeln). Nimm stattdessen
einen Smart-Pointer wie Du ihn zB. bei Boost findest:
http://www.boost.org/libs/smart_ptr/smart_ptr.htm
Ein shared_ptr duerfte genau das sein was Du brauchst: Der Pointer
kann beliebig oft kopiert werden ohne das was passiert. Erst wenn
der letzte dieser Pointer zerstoert wird, dann delete-d der Pointer
auch das dahinterliegende Objekt.


--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
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
Edzard Egberts
Guest





PostPosted: Thu Jun 03, 2004 4:11 pm    Post subject: Re: <vector> elemente anhängen Reply with quote



Hallo Karl Heinz,

Quote:
CAudioBuffer *pBuffer = new CAudioBuffer(strFile);
m_vBuffers.push_back(*pBuffer);

Im std gibt es auch keine vernuenftige Loesung dafuer. Die Loesung
mit dem Pointer Vektor ist prinzipiell schon ok, nur solltest Du
nicht Pointer direkt im Vektor speichern (ausser Du willst Dir
einen Rattenschwanz an Problemen einhandeln).

guck noch mal genau hin, er speichert nicht den Zeiger, sondern das
Objekt. Das ist auch der Grund, warum es Probleme mit dem Kopieren der
dynamischen Elemente gibt - beim Abspeichern von Zeigern wird das Objekt
nicht geändert.
Nur den Zeiger abzuspeichern (auch als Smart-Pointer) würde das Problem
lösen. Die andere Möglichkeit wäre einen Kopierkonstruktor zu
definieren, der die dynamischen Elemente berücksichtigt. Damit würde
dann auch der angegebene Code funktionieren.

Gruß,

Ed

--
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
Stefan Reuther
Guest





PostPosted: Thu Jun 03, 2004 6:18 pm    Post subject: Re: <vector> elemente anhängen Reply with quote

André Schmidt wrote:
Quote:
Wie wäre es wenn ich nur Zeiger auf CAudioBuffer verwende?
zB.
std::vector<CAudioBuffer*> m_vpBuffers;

Hat jemand eine bessere Lösung?

Ich würde genau das tun: einen Vektor mit Zeigern.

Allerdings bietet sich an, das ganze noch nett zu verpacken, damit du
dir keine Speicherlecks einfängst. Im einfachsten Fall also eine Klasse
class AllBuffers {
std::vector<CAudioBuffer*> rep;
public:
// ...
~AllBuffers() {
for (std::vector<CAudioBuffer*>::iterator i = rep.begin();
i != rep.end(); ++i)
{
delete *i; *i = 0;
}
}
};

Eine andere Alternative wären, wie schon genannt, Smart Pointer, aber
besonders wenn die Objekte von jemand anders erzeugt werden wäre ich da
vorsichtig.


Stefan

--
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
Karl Heinz Buchegger
Guest





PostPosted: Fri Jun 04, 2004 8:06 am    Post subject: Re: <vector> elemente anhängen Reply with quote

Edzard Egberts wrote:
Quote:

Hallo Karl Heinz,

CAudioBuffer *pBuffer = new CAudioBuffer(strFile);
m_vBuffers.push_back(*pBuffer);

Im std gibt es auch keine vernuenftige Loesung dafuer. Die Loesung
mit dem Pointer Vektor ist prinzipiell schon ok, nur solltest Du
nicht Pointer direkt im Vektor speichern (ausser Du willst Dir
einen Rattenschwanz an Problemen einhandeln).

guck noch mal genau hin, er speichert nicht den Zeiger, sondern das
Objekt.

Hab ich gesehen. Danach brachte er aber die Frage auf, ob er nicht besser
Pointer statt Objekten speichern sollte. Und darauf bezog sich der gequotete
Kommentar.

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
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é Schmidt
Guest





PostPosted: Sat Jun 05, 2004 7:50 am    Post subject: Re: <vector> elemente anhängen Reply with quote

Danke für die zahlreichen informativen Antworten. Habe jetzt einen
Vektor von Pointern und das funzt ganz gut.
Grüße,
André
--
J.A.E.L.C. - Just another Elite(tm) clone
http://www.szintec.de/software/jaelc/JAELC.php

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