 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
André Schmidt Guest
|
Posted: Thu Jun 03, 2004 12:26 pm Post subject: <vector> elemente anhängen |
|
|
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
|
Posted: Thu Jun 03, 2004 3:44 pm Post subject: Re: <vector> elemente anhängen |
|
|
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
|
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
|
Posted: Thu Jun 03, 2004 4:11 pm Post subject: Re: <vector> elemente anhängen |
|
|
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
|
Posted: Thu Jun 03, 2004 6:18 pm Post subject: Re: <vector> elemente anhängen |
|
|
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
|
Posted: Fri Jun 04, 2004 8:06 am Post subject: Re: <vector> elemente anhängen |
|
|
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
|
Posted: Sat Jun 05, 2004 7:50 am Post subject: Re: <vector> elemente anhängen |
|
|
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 |
|
 |
|
|
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
|
|