<?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[RAII]]></title><description><![CDATA[<p>Hallo,<br />
man sieht in diesem Forum immer öfter was zu dem Thema RAII. Allerdings lassen sich im Internet nicht viele Sachen dazu finden, und deswegen möchte ich jetzt fragen, ob ich das richtig verstanden habe.<br />
Also ich habe eine Klasse Classx<br />
Der Destruktor der Klassen sieht jetzt so aus:</p>
<pre><code class="language-cpp">~Classx {
    delete this;
}
</code></pre>
<p>und so sieht jetzt mein Programm aus:</p>
<pre><code class="language-cpp">Classx *Class1 = new Classx

void foo() {
    Classx *Class2 = new Classx;
    Class1.doSomething();
}

int main() {
    Classx *Class3 = new Classx;
    Class3.doSomething(),
    foo();
    Class1.doSomething();
}
</code></pre>
<p>Stimmt es jetzt, das der Speicher von Class2 am Ende von foo() wieder freigegeben wird, und von Class1 und Class3 der Speicher am Ende des Programmes freigegeben wird?<br />
Und ist das wirklich RAII?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272764/raii</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 17:31:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272764.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Aug 2010 15:30:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 15:30:15 GMT]]></title><description><![CDATA[<p>Hallo,<br />
man sieht in diesem Forum immer öfter was zu dem Thema RAII. Allerdings lassen sich im Internet nicht viele Sachen dazu finden, und deswegen möchte ich jetzt fragen, ob ich das richtig verstanden habe.<br />
Also ich habe eine Klasse Classx<br />
Der Destruktor der Klassen sieht jetzt so aus:</p>
<pre><code class="language-cpp">~Classx {
    delete this;
}
</code></pre>
<p>und so sieht jetzt mein Programm aus:</p>
<pre><code class="language-cpp">Classx *Class1 = new Classx

void foo() {
    Classx *Class2 = new Classx;
    Class1.doSomething();
}

int main() {
    Classx *Class3 = new Classx;
    Class3.doSomething(),
    foo();
    Class1.doSomething();
}
</code></pre>
<p>Stimmt es jetzt, das der Speicher von Class2 am Ende von foo() wieder freigegeben wird, und von Class1 und Class3 der Speicher am Ende des Programmes freigegeben wird?<br />
Und ist das wirklich RAII?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943889</guid><dc:creator><![CDATA[Denksportler]]></dc:creator><pubDate>Tue, 24 Aug 2010 15:30:15 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 15:35:44 GMT]]></title><description><![CDATA[<p>Also bei mir suckt google &quot;Ungefähr 527.000 Ergebnisse (0,14 Sekunden) &quot; aus.</p>
<p>Das erste Beispiel ist dann <a href="http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization" rel="nofollow">http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization</a></p>
<p>Der Destruktor in deinem Beispiel wird nie aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943892</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 24 Aug 2010 15:35:44 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 15:38:41 GMT]]></title><description><![CDATA[<p>Denksportler schrieb:</p>
<blockquote>
<pre><code class="language-cpp">~Classx {
    delete this;
}
</code></pre>
</blockquote>
<p>Stack Overflow Error <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/1943895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943895</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 24 Aug 2010 15:38:41 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 15:55:44 GMT]]></title><description><![CDATA[<p>@manni66<br />
Genau darum geht es doch, dass der Destruktor immer aufgerufen wird, wenn die Variable ihren Gültigkeitsbereich verlässt.<br />
Sagt der hier: <a href="http://de.wikipedia.org/wiki/Ressourcenbelegung_ist_Initialisierung" rel="nofollow">Wikipedia</a><br />
Aber da wird z. B. nur ein Stream geschlossen oder so. Aber oft hört man, dass man mit RAII kein delete mehr aufrufen muss. Und genau da ist meine Frage wie das gehen soll.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24923">@Nukularfüsiker</a><br />
Wieso Stack Overflow? Das liegt doch alles auf dem Heap <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943901</guid><dc:creator><![CDATA[Denksportler]]></dc:creator><pubDate>Tue, 24 Aug 2010 15:55:44 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 15:59:45 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Classx *Class1 = new Classx
</code></pre>
<p>Classx *Class1 Class1 liegt auf den Stack ihres Gültigkeitsbereich und wird vom &quot;System aufgeräumt&quot;, wenn der Gültigkeitsbereich verlassen wird.</p>
<p>Die Instance auf der Zeiger *Class1 zeigt, wird natürlich nur mit einen delete Class1 gelöscht, welches sich auf dem Heap befindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943905</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Tue, 24 Aug 2010 15:59:45 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 16:03:41 GMT]]></title><description><![CDATA[<p>Denksportler schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24923">@Nukularfüsiker</a><br />
Wieso Stack Overflow? Das liegt doch alles auf dem Heap <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Was passiert denn, wenn delete auf einen Objekt-Zeiger aufgerufen wird? Der Destruktor wird aufgerufen.<br />
Und was passiert wohl, wenn ein Objekt per <code>delete this</code> in seinem Destruktor seinen eigenen Destruktor aufruft? (Hintergrundwissen: Bei einem Funktionsaufruf wird die Rücksprungadresse auf den Stack geschoben)</p>
<p>RAII heißt einfach, ganz kurz gesagt, dass man im Konstruktor die Ressourcen belegt und im Destruktor wieder freigibt. Denn der Konstruktor wird aufgerufen, wenn das Objekt anfängt zu leben und der Destruktor wenn es aufhört zu leben. Beide werden automatisch aufgerufen, und das macht man sich zunutze.</p>
<p>Das ist schon alles.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943908</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:03:41 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 16:05:39 GMT]]></title><description><![CDATA[<p>Was du suchst ist das:</p>
<pre><code class="language-cpp">class A
{
 int *x;

public:
 A()
 {
  x = new int;

  *x = 100;
 }

 ~A()
 {
  delete x;
 }

 // Copy Konstruktor, etc. fehlen und sind natürlich zu implementieren!
};

void Foo()
{
 A blub;
} // int *x wird freigegeben
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1943910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943910</guid><dc:creator><![CDATA[mmm,mmmm]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:05:39 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 16:10:14 GMT]]></title><description><![CDATA[<p>Denksportler schrieb:</p>
<blockquote>
<p>Genau darum geht es doch, dass der Destruktor immer aufgerufen wird, wenn die Variable ihren Gültigkeitsbereich verlässt.</p>
</blockquote>
<p>Das wird es auch bei Stackvariablen. RAII arbeitet ausschließlich mit solchen, und kapselt die dynamische Speicherverwaltung falls nötig.</p>
<p>Beispiel (ich nehme hier absichtlich auto_ptr, weil das auf jedem C++ Compiler laufen sollte, auch wenn es bessere Lösungen gibt):</p>
<pre><code class="language-cpp">#include &lt;memory&gt;

class A{/*... komplexerer Inhalt ...*/};

int main()
{
    std::auto_ptr&lt;A&gt; a(new A());
}   // &lt;-- Destruktor von a wird aufgerufen
</code></pre>
<p>Man kann damit noch andere Sachen basteln.</p>
<p>z.B. Verwende ich dies für Datenbanktransaktionen: Bei der Objektinitialisierung wird die Transaktion geöffnet, beim Destruktor verworfen, nur wenn ich explizit das Commit der Klasse aufrufe, wird geschrieben. So ist sichergestellt das im Fehlerfall die Transaktion zurückgesetzt wird.</p>
<p>Merke also: RAII arbeitet grundsätzlich mit Stackvariablen, diese wiederum können sich um Speicherallokation/-freigabe (wie auto_ptr, oder andere Smartpointer) kümmern, oder um gänzlich andere Ressourcen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943914</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:10:14 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 16:30:19 GMT]]></title><description><![CDATA[<p>Danke für eure Erklärungen. Also muss ich wenn ich ein Klassenobjekt mit new erzeuge auch wieder mit delete löschen.<br />
Ich habe aber jetzt in der boost Bibliothek den scoped_ptr gefunden.<br />
Aber kann ich den Speicher eines scoped_ptr wieder freigeben, bevor er seinen Gültigkeitsbereich verläasst?<br />
In der Referenz habe ich nur den Destruktor gefunden, und kann man den ohne weiteres dann einfach aufrufen?<br />
Selber ausprobieren kann ich es leider noch nicht, da ich noch eine ganze Weile brauche, bis die boost lib runtergeladen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943926</guid><dc:creator><![CDATA[Denksportler]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:30:19 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 16:32:41 GMT]]></title><description><![CDATA[<p>RAII ist ein Akronym. Es steht für &quot;Resource Acquisition Is Initialization&quot;. Die eigentliche Idee ist es, Ressourcen (zB reservierter Speicher, geöffnete Dateien, etc) an Objekte zu koppeln, so dass sie &quot;verantwortlich&quot; für die Verwaltung werden. Beispielsweise verwaltet/besitzt ein std::list&lt;&gt;-Objekt all seine Knotenobjekte. Ein ifstream-Objekt verwaltet eine geöffnete Datei. Verantwortung für Ressourcen so an Objekte zu delegieren, ist der ganze Witz an der Sache. Wenn man dieses Prinzip zu schätzen weiß und sich auch Design-technisch danach ausrichtet, geht die Gefahr von Ressourcen-Lecks durch Programmierfehler (hier ein <code>delete</code> vergessen, dort ein <code>fclose</code> vergessen) gegen Null.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943929</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:32:41 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 16:41:55 GMT]]></title><description><![CDATA[<p>Denksportler schrieb:</p>
<blockquote>
<p>Ich habe aber jetzt in der boost Bibliothek den scoped_ptr gefunden.<br />
Aber kann ich den Speicher eines scoped_ptr wieder freigeben, bevor er seinen Gültigkeitsbereich verläasst?</p>
</blockquote>
<p>&quot;Speicher eines scoped_ptr&quot; könnte auf ein Missverständnis hindeuten. Das scoped_ptr-Objekt liegt natürlich auch irgendwo im Speicher. Aber ich glaube das ist nicht das, was Du meintest, richtig? Du musst das schon von einander trennen und nicht in einen Topf werfen. Das scoped_ptr-Dingen und das, worauf er zeigt sind zwei verschiedene Dinge, und beides Objekte. Wenn ich mich richtig erinnere, bietet scoped_ptr eine reset-Funktion an, mit der der Speicher, auf den der scoped_ptr zeigt, früher wieder freigegeben werden kann.</p>
<p>Denksportler schrieb:</p>
<blockquote>
<p>In der Referenz habe ich nur den Destruktor gefunden, und kann man den ohne weiteres dann einfach aufrufen?</p>
</blockquote>
<p>Nein. Destrukturen ruft man nur ganz ganz selten manuell auf. Destruktoren werden automatisch aufgerufen, wenn der Gültigkeitsbereich verlassen/beendet wird oder wenn man ein dynamisch erzeugtes Objekt per delete oder delete[] wieder löschen will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943935</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:41:55 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 16:43:24 GMT]]></title><description><![CDATA[<p>Denksportler schrieb:</p>
<blockquote>
<p>Aber kann ich den Speicher eines scoped_ptr wieder freigeben, bevor er seinen Gültigkeitsbereich verläasst?</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;boost/scoped_ptr.hpp&gt;

int main()
{
    boost::scoped_ptr&lt;int&gt; a(new int(1));
    a.reset(0);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1943936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943936</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 24 Aug 2010 16:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 17:31:06 GMT]]></title><description><![CDATA[<p>Ok danke, für eure Antworten. Bosst ist jett runtergeladen und dann probier ich das jetzt mal alles aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943958</guid><dc:creator><![CDATA[Denksportler]]></dc:creator><pubDate>Tue, 24 Aug 2010 17:31:06 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 19:53:38 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Das wird es auch bei Stackvariablen. RAII arbeitet ausschließlich mit solchen,</p>
</blockquote>
<p>Warum sollte RAII nur mit Variablem auf dem Stack gehen? Ich kann ein file/stream auch mit new anlegen und beim delete wird immer noch automatisch close aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944005</guid><dc:creator><![CDATA[tschoiren]]></dc:creator><pubDate>Tue, 24 Aug 2010 19:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 20:13:25 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Merke also: RAII arbeitet grundsätzlich mit Stackvariablen</p>
</blockquote>
<p>Nö.</p>
<p>RAII ist einfach RAII und vollkommen orthogonal zu automatic storage duration vs. new/delete.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944016</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 24 Aug 2010 20:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to RAII on Tue, 24 Aug 2010 20:35:06 GMT]]></title><description><![CDATA[<p>tschoiren schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>Das wird es auch bei Stackvariablen. RAII arbeitet ausschließlich mit solchen,</p>
</blockquote>
<p>Warum sollte RAII nur mit Variablem auf dem Stack gehen? Ich kann ein file/stream auch mit new anlegen und beim delete wird immer noch automatisch close aufgerufen.</p>
</blockquote>
<p>Gut, mag sein, aber dann muss man deutlich mehr auf Exceptions etc. aufpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1944029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1944029</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 24 Aug 2010 20:35:06 GMT</pubDate></item></channel></rss>