<?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[Speicherverwalten bei Strategy Pattern. Gute Idee?]]></title><description><![CDATA[<p>Hiho alle zusammen,</p>
<p>schreibe gerade an einer Klasse bei der ich das Strategie Patter anwende.</p>
<p>Um das aktuelle Verhalten zu setzen biete ich eine setMethode an</p>
<pre><code class="language-cpp">void MeineKlasse::setStrategie(Strategie * stra);
{
   strategie = stra;
}
</code></pre>
<p>von außen kann ich also folgendes machen</p>
<pre><code class="language-cpp">MeinObjekt.setStrategie(new Strategie1());
</code></pre>
<p>Da ich hier allerding keinen Zugriff mehr habe auf das Objekt habe ich ja ein Memoryleak gebaut!?!</p>
<p>Nun zu meiner Frage. Ist es eine gute / Ausreichende Idee vor dem setzen der Strategie die alte zu deleten?</p>
<pre><code class="language-cpp">void MeineKlasse::setStrategie(Strategie * stra);
{
   delete strategie;
   strategie = stra;
}
</code></pre>
<p>Im Konstruktor habe ich die Strategie per default auf 0 gesetzt. Und im Konstruktor, delete ich die Strategie auch wieder.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258482/speicherverwalten-bei-strategy-pattern-gute-idee</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 10:00:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258482.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Jan 2010 09:47:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 09:47:17 GMT]]></title><description><![CDATA[<p>Hiho alle zusammen,</p>
<p>schreibe gerade an einer Klasse bei der ich das Strategie Patter anwende.</p>
<p>Um das aktuelle Verhalten zu setzen biete ich eine setMethode an</p>
<pre><code class="language-cpp">void MeineKlasse::setStrategie(Strategie * stra);
{
   strategie = stra;
}
</code></pre>
<p>von außen kann ich also folgendes machen</p>
<pre><code class="language-cpp">MeinObjekt.setStrategie(new Strategie1());
</code></pre>
<p>Da ich hier allerding keinen Zugriff mehr habe auf das Objekt habe ich ja ein Memoryleak gebaut!?!</p>
<p>Nun zu meiner Frage. Ist es eine gute / Ausreichende Idee vor dem setzen der Strategie die alte zu deleten?</p>
<pre><code class="language-cpp">void MeineKlasse::setStrategie(Strategie * stra);
{
   delete strategie;
   strategie = stra;
}
</code></pre>
<p>Im Konstruktor habe ich die Strategie per default auf 0 gesetzt. Und im Konstruktor, delete ich die Strategie auch wieder.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836667</guid><dc:creator><![CDATA[sirchillalot]]></dc:creator><pubDate>Mon, 11 Jan 2010 09:47:17 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 10:38:16 GMT]]></title><description><![CDATA[<p>Nimm shared_ptr aus der boost Bibliothek oder TR1, damit hast du alle Probleme gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836686</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 11 Jan 2010 10:38:16 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 10:41:42 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Nimm shared_ptr aus der boost Bibliothek oder TR1, damit hast du alle Probleme gelöst.</p>
</blockquote>
<p>habe hier leider kein boost zur Verfügung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836687</guid><dc:creator><![CDATA[sirchillalot]]></dc:creator><pubDate>Mon, 11 Jan 2010 10:41:42 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 10:47:08 GMT]]></title><description><![CDATA[<p>Deine Klassen können sich sonst ja auch bei den Strategien an- und abmelden, so daß diese sich dann selbst zerstören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836689</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 11 Jan 2010 10:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 11:48:04 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Deine Klassen können sich sonst ja auch bei den Strategien an- und abmelden, so daß diese sich dann selbst zerstören.</p>
</blockquote>
<p>Weiß gerade nicht was du meinst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836716</guid><dc:creator><![CDATA[sirchillalot]]></dc:creator><pubDate>Mon, 11 Jan 2010 11:48:04 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 12:08:38 GMT]]></title><description><![CDATA[<p>Du musst eine grundsätzliche Designentscheidung treffen. Nämlich solltest du festlegen, ob deine Strategy-Klasse ihre Strategien besitzt oder nur referenziert. Im ersten Fall ist sie selbst für die Freigabe verantwortlich, im zweiten wird der Speicher unabhängig davon irgendwo ausserhalb verwaltet. Der zweite Weg hat den Vorteil, dass dem Benutzer mehr Freiheiten gelassen werden (z.B. können automatische Objekten eingesetzt werden, und man hat mehr Kontrolle über die Erzeugung/Zerstörung seiner Objekte). Hier ein kleines Beispiel; wahrscheinlicher ist aber, dass es sich bei <code>s</code> um einen Member handelt (es sei denn, du willst die Strategie nur innerhalb des Scopes).</p>
<pre><code class="language-cpp">CustomStrategy s; // CustomStrategy erbt von Strategy
MyObject.setStrategy(&amp;s);
</code></pre>
<p>Andererseits möchtest du das Strategie-Objekt vielleicht nicht ausserhalb speichern, sondern nach dem Zuweisen vergessen. Es besteht nämlich auch die Gefahr, dass der Zeiger ungültig wird, wenn das Objekt ausserhalb zerstört wird. Dann lohnt es sich, wenn das dynamisch angeforderte Strategy-Objekt von der Klasse selbst verwaltet und bei Bedarf auch zerstört wird. Denke dran, in diesem Fall die Grossen Drei (Kopierkonstruktor, Zuweisungsoperator, Destruktor) zu implementieren und dem Benutzer per Dokumentation genau mitzuteilen, dass er den Besitz über das Objekt verliert und dass es sich um mit <code>new</code> angeforderten Speicher handeln muss. Unmissverständlich gehts über <code>std::auto_ptr</code> .</p>
<pre><code class="language-cpp">MyObject.setStrategy(new CustomStrategy());
</code></pre>
<p>P.S.: <code>shared_ptr</code> gibt es wie gesagt auch im TR1, und der wird von vielen modernen Standardbibliotheken implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836724</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 11 Jan 2010 12:08:38 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 12:27:00 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Du musst eine grundsätzliche Designentscheidung treffen. Nämlich solltest du festlegen, ob deine Strategy-Klasse ihre Strategien besitzt oder nur referenziert. Im ersten Fall ist sie selbst für die Freigabe verantwortlich, im zweiten wird der Speicher unabhängig davon irgendwo ausserhalb verwaltet. Der zweite Weg hat den Vorteil, dass dem Benutzer mehr Freiheiten gelassen werden (z.B. können automatische Objekten eingesetzt werden, und man hat mehr Kontrolle über die Erzeugung/Zerstörung seiner Objekte). Hier ein kleines Beispiel; wahrscheinlicher ist aber, dass es sich bei <code>s</code> um einen Member handelt (es sei denn, du willst die Strategie nur innerhalb des Scopes).</p>
<pre><code class="language-cpp">CustomStrategy s; // CustomStrategy erbt von Strategy
MyObject.setStrategy(&amp;s);
</code></pre>
<p>Andererseits möchtest du das Strategie-Objekt vielleicht nicht ausserhalb speichern, sondern nach dem Zuweisen vergessen. Es besteht nämlich auch die Gefahr, dass der Zeiger ungültig wird, wenn das Objekt ausserhalb zerstört wird. Dann lohnt es sich, wenn das dynamisch angeforderte Strategy-Objekt von der Klasse selbst verwaltet und bei Bedarf auch zerstört wird. Denke dran, in diesem Fall die Grossen Drei (Kopierkonstruktor, Zuweisungsoperator, Destruktor) zu implementieren und dem Benutzer per Dokumentation genau mitzuteilen, dass er den Besitz über das Objekt verliert und dass es sich um mit <code>new</code> angeforderten Speicher handeln muss. Unmissverständlich gehts über <code>std::auto_ptr</code> .</p>
<pre><code class="language-cpp">MyObject.setStrategy(new CustomStrategy());
</code></pre>
<p>P.S.: <code>shared_ptr</code> gibt es wie gesagt auch im TR1, und der wird von vielen modernen Standardbibliotheken implementiert.</p>
</blockquote>
<p>Punkt 2 ist das was ich möchte. Der User soll nur ein &quot;anonymes&quot; Objekt an die Mehtode übergeben. Um das löschen soll sich die Strategieklasse kümmern.<br />
Ich versuche gerade boost unter Borland c++ Builder 2006 zu installieren. Scheint aber nicht ganz einfach zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836732</guid><dc:creator><![CDATA[sirchillalot]]></dc:creator><pubDate>Mon, 11 Jan 2010 12:27:00 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 12:27:41 GMT]]></title><description><![CDATA[<p>Eine weitere Möglichkeit wäre eine clone() Funktion für alle Strategy Klassen zum implementieren, sodass der Client per clone() eine private Kopie erzeugen kann, die er auch besitzt. Mit dieser Technik können sogar Clients kopiert werden, ohne dass es zu Konflikten kommt:</p>
<pre><code class="language-cpp">class MyObject
{
   Strategy* Strategy_;

public:
   MyObject() : Strategy_( 0 )
   {
   }

   MyObject( const MyObject&amp; obj ) : Stratey_( 0 )
   {
      set_strategy( obj-&gt;Strategy_  );
   }

   MyObject&amp; operator=( const MyObject&amp; obj )
   {
      if( this != &amp;obj )
      {
         set_strategy( obj-&gt;Strategy_  );
      }
      return *this;
   }

   ~MyObject()
   {
      set_strategy( 0 );
   }

   void set_strategy( const Strategy* Strategy )
   {
      Strategy* Clone = 0;
      if( Strategy )
      {
         Clone = Strategy-&gt;clone();
      }
      if( Strategy_ )
      {
         delete Strategy_;
      }
      Strategy_ = Clone; 
   }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1836733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836733</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 11 Jan 2010 12:27:41 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 12:31:03 GMT]]></title><description><![CDATA[<p>Ich benutze Codegear RAD Studio 2007 und die letzte funktionierende boost Bibliothek ist 1.34.1. Die Versionen 1.40 und 1.41 habe ich noch nicht getestet, aber 1.36 und 1.39 konnte ich nicht kompilieren, zumindest nicht alle Bibliotheken.<br />
smart_ptr.hpp sollten aber alle gehen, da es eine Header-only Bibliothek ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836737</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 11 Jan 2010 12:31:03 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 12:34:06 GMT]]></title><description><![CDATA[<p>Warum nicht einfach den Copy-Ctor statt dieser Clone-Funktion?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836739</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 11 Jan 2010 12:34:06 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverwalten bei Strategy Pattern. Gute Idee? on Mon, 11 Jan 2010 13:34:07 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>Warum nicht einfach den Copy-Ctor statt dieser Clone-Funktion?</p>
</blockquote>
<p>Weil das Strategy Objekt polymorph und der konkrete Typ nicht bekannt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836773</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 11 Jan 2010 13:34:07 GMT</pubDate></item></channel></rss>