<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Template Ringbuffer]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich brauche in meinem Projekt einen generischen &quot;Ringbuffer&quot;. Damit meine ich folgendes: Zur Compilezeit ist die größe und der Typ klar, man legt ihn also so an:</p>
<pre><code class="language-cpp">Ringbuffer&lt;int, 5&gt; foo;
</code></pre>
<p>foo kann also jetzt 5 ints aufnehmen. Wenn ich das 6. Element hinzufüge, dann wird das 1. Element überschrieben. Das 7. Element überschreibt das 2. usw. Ich kann also unendlich viele Elemente hinzufügen, ingesamt speichert er aber immer nur eine fixe Anzahl und die ältesten Elemente werden überschrieben.</p>
<p>Mein Problem:<br />
Wenn der Buffer voll ist, werden ja die ältesten Daten überschrieben. Bei primitiven Typen wie int, float is das kein Problem. Mein Problem ist jedoch, dass ich auch Zeiger speichern werde und zwar auf Objekte auf dem Heap. Also sowas:</p>
<pre><code class="language-cpp">Ringbuffer&lt;int*, 2&gt; foo2;
foo2.push( new int(3) );
foo2.push( new int(11) );
foo2.push( new int(20) );
</code></pre>
<p>Hier hätte ich nun ein Speicherleck erzeugt, da der Buffer ja nur 2 Elemente speichern kann und das 3. Element das 1. Element überschreiben würde. Den Speicher von new int(3) kann ich also nie mehr freigeben.</p>
<p>Wie designe ich den Buffer so, dass er auch mit Heap alloziierten Speicher klarkommt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/255096/template-ringbuffer</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 05:48:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/255096.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Nov 2009 16:48:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Ringbuffer on Wed, 25 Nov 2009 16:48:21 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich brauche in meinem Projekt einen generischen &quot;Ringbuffer&quot;. Damit meine ich folgendes: Zur Compilezeit ist die größe und der Typ klar, man legt ihn also so an:</p>
<pre><code class="language-cpp">Ringbuffer&lt;int, 5&gt; foo;
</code></pre>
<p>foo kann also jetzt 5 ints aufnehmen. Wenn ich das 6. Element hinzufüge, dann wird das 1. Element überschrieben. Das 7. Element überschreibt das 2. usw. Ich kann also unendlich viele Elemente hinzufügen, ingesamt speichert er aber immer nur eine fixe Anzahl und die ältesten Elemente werden überschrieben.</p>
<p>Mein Problem:<br />
Wenn der Buffer voll ist, werden ja die ältesten Daten überschrieben. Bei primitiven Typen wie int, float is das kein Problem. Mein Problem ist jedoch, dass ich auch Zeiger speichern werde und zwar auf Objekte auf dem Heap. Also sowas:</p>
<pre><code class="language-cpp">Ringbuffer&lt;int*, 2&gt; foo2;
foo2.push( new int(3) );
foo2.push( new int(11) );
foo2.push( new int(20) );
</code></pre>
<p>Hier hätte ich nun ein Speicherleck erzeugt, da der Buffer ja nur 2 Elemente speichern kann und das 3. Element das 1. Element überschreiben würde. Den Speicher von new int(3) kann ich also nie mehr freigeben.</p>
<p>Wie designe ich den Buffer so, dass er auch mit Heap alloziierten Speicher klarkommt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813440</guid><dc:creator><![CDATA[ringbufferschreiber]]></dc:creator><pubDate>Wed, 25 Nov 2009 16:48:21 GMT</pubDate></item><item><title><![CDATA[Reply to Template Ringbuffer on Wed, 25 Nov 2009 17:11:06 GMT]]></title><description><![CDATA[<p>ringbufferschreiber schrieb:</p>
<blockquote>
<p>Wie designe ich den Buffer so, dass er auch mit Heap alloziierten Speicher klarkommt?</p>
</blockquote>
<p>Das macht die andere Klasse</p>
<pre><code class="language-cpp">PtrRingbuffer&lt;int, 5&gt; foo;
</code></pre>
<pre><code class="language-cpp">void push(T* ptr){
   delete data[writePos];
   data[writePos]=ptr;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1813455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813455</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 25 Nov 2009 17:11:06 GMT</pubDate></item><item><title><![CDATA[Reply to Template Ringbuffer on Wed, 25 Nov 2009 17:24:40 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Antwort <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ok verstehe, du rätst mir also 2 Klassen anzulegen. Die Idee hatte ich auch schon, wusste aber nicht, ob das in C++ gut ist.<br />
Man kann doch irgendwie auch Templates spezialisieren. Würde das in meinem Fall gehen? Also das ich einen Ringbuffer für Typ T habe (alle nicht-pointer) und für T* eine Spezialisierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813463</guid><dc:creator><![CDATA[ringbufferschreiber]]></dc:creator><pubDate>Wed, 25 Nov 2009 17:24:40 GMT</pubDate></item><item><title><![CDATA[Reply to Template Ringbuffer on Wed, 25 Nov 2009 17:34:40 GMT]]></title><description><![CDATA[<p>ringbufferschreiber schrieb:</p>
<blockquote>
<p>Danke für die schnelle Antwort <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ok verstehe, du rätst mir also 2 Klassen anzulegen. Die Idee hatte ich auch schon, wusste aber nicht, ob das in C++ gut ist.<br />
Man kann doch irgendwie auch Templates spezialisieren. Würde das in meinem Fall gehen? Also das ich einen Ringbuffer für Typ T habe (alle nicht-pointer) und für T* eine Spezialisierung.</p>
</blockquote>
<p>Nö! Ptr... ist ein Container, der delete ausführt.<br />
Kannst einen RingBuffer&lt;int*&gt; machen, der macht kein delete, um Zeiger in ein fremdes Array zu halten. Und ein PtrRingBuffer&lt;int&gt; (oder PtrRingBuffer&lt;int*&gt;, ka, wie Du das haben willst) löscht eben bei Bedarf, aber ein Zeiger in ein fremdes Array darf ja nicht mit delete gelöscht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813468</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 25 Nov 2009 17:34:40 GMT</pubDate></item></channel></rss>