<?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[Gültigkeitsbereiche]]></title><description><![CDATA[<p>Hallo mal wieder,</p>
<p>ich bekomm immer wieder Probleme beim Verwenden von Zeigern und Referenzen.<br />
Bei Referenzen weiss ich, dass sie nur innerhalb des anlegenden Scopes gültig sind, aber wie siehts mit Zeigern aus?</p>
<p>Z.B.:</p>
<pre><code class="language-cpp">vector&lt;Test *&gt; testVector;
void MyClass::test()
{
    Test t1();
    testVector.push_back(&amp;t1);
    Test t2();
    testVector.push_back(&amp;t2);
}
</code></pre>
<p>Sind nun nach Verlassen der Methode test() im testVector gültige Zeiger oder nicht?</p>
<p>Was passiert hier eigentlich:</p>
<pre><code class="language-cpp">vector&lt;Test&gt; testVector;
void MyClass::add(const Test&amp; test) { testVector.push_back(test); }
</code></pre>
<p>Wird hier ein Duplikat des Objekts angelegt, welches sich hinter der übergebenen Referenz verbirgt?</p>
<p>Hab nun schon einiges zu Referenzen und Zeigern gelesen, komme aber bei solchen Situationen immer wieder ins Schleudern.</p>
<p>Kann mir das einer bitte idiotensicher erklären?!</p>
<p>Danke schon mal.</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/140443/gültigkeitsbereiche</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 08:55:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/140443.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Mar 2006 20:54:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gültigkeitsbereiche on Tue, 14 Mar 2006 20:54:51 GMT]]></title><description><![CDATA[<p>Hallo mal wieder,</p>
<p>ich bekomm immer wieder Probleme beim Verwenden von Zeigern und Referenzen.<br />
Bei Referenzen weiss ich, dass sie nur innerhalb des anlegenden Scopes gültig sind, aber wie siehts mit Zeigern aus?</p>
<p>Z.B.:</p>
<pre><code class="language-cpp">vector&lt;Test *&gt; testVector;
void MyClass::test()
{
    Test t1();
    testVector.push_back(&amp;t1);
    Test t2();
    testVector.push_back(&amp;t2);
}
</code></pre>
<p>Sind nun nach Verlassen der Methode test() im testVector gültige Zeiger oder nicht?</p>
<p>Was passiert hier eigentlich:</p>
<pre><code class="language-cpp">vector&lt;Test&gt; testVector;
void MyClass::add(const Test&amp; test) { testVector.push_back(test); }
</code></pre>
<p>Wird hier ein Duplikat des Objekts angelegt, welches sich hinter der übergebenen Referenz verbirgt?</p>
<p>Hab nun schon einiges zu Referenzen und Zeigern gelesen, komme aber bei solchen Situationen immer wieder ins Schleudern.</p>
<p>Kann mir das einer bitte idiotensicher erklären?!</p>
<p>Danke schon mal.</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016354</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 14 Mar 2006 20:54:51 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Tue, 14 Mar 2006 21:03:04 GMT]]></title><description><![CDATA[<p>Hi!</p>
<pre><code class="language-cpp">void foo()
{
  int x; // x ist nur innerhalb der Funktion Foo gültig
  int *y = new int; // y zeigt auf einen Speicherbereich der auch nach verlassen der Funktion Foo belegt ist
}

// von obj wird eine referenz übergeben, also keine Kopie des Objektes selbst angelegt. 
// Da &quot;const&quot; kann obj aber auch nicht geändert werden
void bar( const Klasse &amp;obj ) 
{
  obj.nurlesezugriff...
}

// Wie oben eine Referenz, aber auch mit dem Recht zu verändern
void bar( Klasse &amp;obj )
{
  int x;

  // set will einen zeiger und bekommen die adresse &quot;&amp;&quot; von x übergeben
  // leider leider wird x aber nach verlassen der Funktion zerstört und der 
  // Zeiger hinter &quot;set&quot; zeigt auf einen ungültigen Speicherbereich
  obj.set( &amp;x ) 
  obj.get()
}

// Ähnliche Anwendung wie Referenzen, keine Kopie und Objekt kann geändert werden
void bar( Klasse *obj )
{
}

std::list&lt; int &gt; l;
// referenz von list übergeben, so spart man sich die kopie und die Änderung wirkt sich auch nach Aussen aus...
void blubb( std::list&lt; int &gt; &amp;list ) 
{
  int x = 10;
  list.push_back( x ); // von x wird eine kopie erzeugt und in list abgelegt
}
</code></pre>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016360</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 14 Mar 2006 21:03:04 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Tue, 14 Mar 2006 21:14:40 GMT]]></title><description><![CDATA[<p>Recht vielen Dank für die Erläuterungen!</p>
<p>Aber wie verhält es sich denn bei meinem 2. Bsp.?<br />
Wird dort eine Kopie des Objektes angelegt, dessen Referenz übergeben wird?<br />
Darf ja eigentlich nicht sein, da const - oder?<br />
Aber was wird dann auf den vector gelegt? Funktioniert hat der Code zumindest!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016368</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 14 Mar 2006 21:14:40 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Tue, 14 Mar 2006 21:16:37 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Das ist egal ob const oder nicht. Der Vektor erwartet keinen Zeiger und noch viel weniger eine Referenz. Das Objekt wird kopiert und im Vektor abgelegt.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016369</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 14 Mar 2006 21:16:37 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Tue, 14 Mar 2006 21:32:32 GMT]]></title><description><![CDATA[<p>Danke schön!</p>
<p>Kann dann das abgelegte Objekt geändert werden, wenn man es aus dem vector holt? Denke schon, oder?</p>
<p>Eine letzte Frage noch: Gibt es denn dann Möglichkeiten, Objekte und Variablen über Methoden- und Klassengrenzen hinweg zu verwenden, ohne sie immer alle zu übergeben, ohne sie alle global zu machen und ohne new zu verwenden?</p>
<p>Kenne zumindest keine.<br />
Mein Problem mit new und delete ist, dass ich wenn ich Objekte dynamisch erzeuge ja nicht weiss, wie viele es sind wenn new und delete an unterschiedlichen Stellen ausgeführt werden müssen.<br />
Noch schlimmer wird es, wenn Zeiger auf Objekte an unterschiedlichen Stellen eingetragen werden und dann u.U. versucht wird ein Objekt 2 Mal mit delete freizugeben.</p>
<p>Gibts da ne gute Vorgehensweise?</p>
<p>Konkret hab ich ne Klasse, in deren init-Methode ich eine Reihe von Objekten anlege, die in dieser Klasse und in anderen Klassen verwendet werden. Zeiger darauf werden in einen vector eingetragen. Die Objekte werden mit new angelegt.<br />
Aber wo gebe ich sie wie wieder frei? Wenn sie nur in diesem einen vector stehen ist es kein Problem: Ich durchlaufe ihn und mache ein delete mit jedem Objekt im vector. Aber wenn ich sie in untersch. vector-Objekte lege, dann bekomme ich Probleme, wenn ich den delete mit jedem dieser vector-Objekte wie eben beschrieben mache.</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016380</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 14 Mar 2006 21:32:32 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Tue, 14 Mar 2006 21:53:36 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Du könntest Statische Variablen verwenden. Was mir nicht ganz klar ist, ist was du mit &quot;immer übergeben&quot; meinst.</p>
<p>Das Problem mit dem mehrfachfreigeben von Speicher kannst du mit <em>Shared Pointern</em> und Referenzenzählung lösen.<br />
Auch ein Thema in das du dich mal einlesen solltest: Smart Pointer.</p>
<p>Dieser Lösungsansatz hilft dir auch bei der Problemlösung deiner letzten Frage!</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016388</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 14 Mar 2006 21:53:36 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Tue, 14 Mar 2006 22:17:27 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Hi!</p>
<p>Du könntest Statische Variablen verwenden. Was mir nicht ganz klar ist, ist was du mit &quot;immer übergeben&quot; meinst.</p>
</blockquote>
<p>An andere Klassen, Methoden usw.</p>
<blockquote>
<p>Das Problem mit dem mehrfachfreigeben von Speicher kannst du mit <em>Shared Pointern</em> und Referenzenzählung lösen.<br />
Auch ein Thema in das du dich mal einlesen solltest: Smart Pointer.</p>
<p>Dieser Lösungsansatz hilft dir auch bei der Problemlösung deiner letzten Frage!</p>
<p>grüße</p>
</blockquote>
<p>Das muss ich mir dann wohl auch mal antun! Gibt es noch nen anderen Ansatz, um mit new und delete ordentlich umzugehen?</p>
<p>Danke!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016395</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 14 Mar 2006 22:17:27 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Wed, 15 Mar 2006 07:53:45 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Es gibt mehrere Vorgehensweisen. Aber wenn du wissen willst wieviel Zeiger auf einen Speicherbereich zeigen kommst du kaum um einen Refcounter rum.<br />
Das schöne an Smartpointern ist ja, das der Speicher automatisch freigegeben wird und du dich um nichtsmehr kümmern musst.<br />
Die Speicherfreigabe geschieht auch im falle von Ausnahmen:</p>
<pre><code class="language-cpp">try
{
   smartpointer&lt; aufdeinobjekt &gt; ptr( new deinobjekt );
   irgendeinfehlerwirdgeschmissen
}
catch( ... )
{
  //
}

// Normal wär der Speicher hier verloren...
</code></pre>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016462</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 15 Mar 2006 07:53:45 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Fri, 17 Mar 2006 21:48:16 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Hi!</p>
<p>Es gibt mehrere Vorgehensweisen. Aber wenn du wissen willst wieviel Zeiger auf einen Speicherbereich zeigen kommst du kaum um einen Refcounter rum.</p>
</blockquote>
<p>Hm, eigentlich interessiert mich das nur sekundär.<br />
Mein Problem ist, dass ich in einer Methode anonyme Objekte mit new erzeuge und diese in einer anderen Klasse eintrage. Nun dachte ich mir, dass ich im Destruktor dieser anderen Klasse alle diese eingetragenen Objekte mit delete lösche.</p>
<p>Oder wie ist in C++ das Vorgehen mit anonym mit new erzeugten Objekten?</p>
<blockquote>
<p>Das schöne an Smartpointern ist ja, das der Speicher automatisch freigegeben wird und du dich um nichtsmehr kümmern musst.<br />
Die Speicherfreigabe geschieht auch im falle von Ausnahmen:</p>
</blockquote>
<p>Heisst das, dass man kein delete mehr braucht?</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1018722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1018722</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Fri, 17 Mar 2006 21:48:16 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Sat, 18 Mar 2006 07:36:28 GMT]]></title><description><![CDATA[<p>Das delete steht im Dtor der Smartpointerklasse. Objekte von dieser Smartpointerklasse erstellst auf dem Stack, nicht auf dem Heap(new/delete). Sobald dann dieses Objekt den Gültigkeitsbereich verlässt wird der Dtor aufgerufen und automatisch deleted.</p>
<p>Du brauchst es also noch in der Smartpointerklasse, aber sonst nicht mehr. Die Gefahr, ein delete mal zu vergessen, ist somit eigentlich nicht mehr gegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1018797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1018797</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Sat, 18 Mar 2006 07:36:28 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Sat, 18 Mar 2006 10:24:41 GMT]]></title><description><![CDATA[<p>mantiz schrieb:</p>
<blockquote>
<p>Das delete steht im Dtor der Smartpointerklasse. Objekte von dieser Smartpointerklasse erstellst auf dem Stack, nicht auf dem Heap(new/delete). Sobald dann dieses Objekt den Gültigkeitsbereich verlässt wird der Dtor aufgerufen und automatisch deleted.</p>
</blockquote>
<p>Vielen Dank für die Erklärung!<br />
Das ist aber genau das, was ich eigentlich nicht brauche - Objekte/Zeiger auf dem Stack. Die Objekte, die ich mit new anlege, werden während des ganzen Programmablaufs benötigt und das an verschiedenen Stellen.<br />
Werde dann wohl am besten auf eine Art Factory-Modell umsteigen, und die Objekte über create-Methoden in ihren Verwaltungsklassen erstellen lassen. In den Destruktoren der Verwalterklassen werden diese Objekte dann wieder deleted.<br />
Oder gibt es auch ne Art SmartPointer für den Heap?</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1018865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1018865</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Sat, 18 Mar 2006 10:24:41 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Sat, 18 Mar 2006 13:09:55 GMT]]></title><description><![CDATA[<p>Versteh' ich jetzt nicht so ganz. Die Objekte, auf die der Smartpointer zeigt, die werden weiterhin auf dem Heap angelegt. Lediglich die Objekte der Smartpointer werden auf dem Stack angelegt und diese sind wenn überhaupt nur minimal größer, als die Variable, die den per new erzeugten Zeiger enthält.<br />
Also, ob nun die Variable, die sowieso auf dem Stack landet, oder das Objekt einer Smartpointerklasse, dürfte eigentlich egal sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1018993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1018993</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Sat, 18 Mar 2006 13:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Sat, 18 Mar 2006 21:54:25 GMT]]></title><description><![CDATA[<p>Hm, dann hab ich Deine Erklärung wohl missverstanden, weil da stand, dass Objekte, auf welche die Smartpointerklasse zeigt auf dem Stack erstellt werden.</p>
<p>Kenne mich wie gesagt mit Smartpointern nicht aus.<br />
Was passiert denn, wenn ich in einer Methode ein Objekt mittels Smartpointer erstelle und diesen dann einer anderen Klasse übergebe und die Methode, in welcher der Smartpointer erstellt wurde beendet wird?</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1019376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1019376</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Sat, 18 Mar 2006 21:54:25 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Sat, 18 Mar 2006 22:34:01 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Kommt auf die Art des SmartPtr an. Wenn du Referenzenzählung machst passiert garnichts. Dann wird der Speicher erst freigegeben sobald keine Instanz mehr den Speicher verwendet.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1019400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1019400</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 18 Mar 2006 22:34:01 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Sun, 19 Mar 2006 12:58:17 GMT]]></title><description><![CDATA[<p>Jop, in solch' einem Fall sollte man wohl Referenzzählung verwenden.</p>
<p>Die Klasse kapselt nur die new/delete-Aufrufe, sehr elementar sieht das ganze so aus:</p>
<pre><code class="language-cpp">template&lt;class C&gt;
class SmartPtr {
    public:
        SmartPtr(C* ob) : m_Object(ob) {
        }
        ~SmartPtr() {
            delete m_Object();
        }
    private:
        C* m_Object;
};
</code></pre>
<p>verwenden kannst Du das dann so:</p>
<pre><code class="language-cpp">SmartPtr&lt;Klasse1&gt; ptr( new Klasse1() );
</code></pre>
<p>Das Objekt von Klasse1 wird ganz normal auf dem Heap platziert, aber das Objekt der Klasse SmartPtr&lt;Klasse1&gt; landet auf dem Stack, also wird der Dtor aufgerufen, sobald das Objekt vom SmartPtr&lt;Klasse1&gt; den Gültigkeitsbereich verlässt, dort wird dann delete aufgerufen.<br />
Jetzt kann man in der Klasse noch nen Member einfügen, der bei jedem neuen Zeiger erhöht wird und im Dtor runterzählt und erst, wenn der Zähler auf 0 steht, dann wird delete aufgerufen.<br />
Dann kann man noch Operatoren überladen, irgendwie muss man ja auch auf das Objekt zugreifen, welches im SmartPtr gehalten wird. <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/1019613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1019613</guid><dc:creator><![CDATA[mantiz]]></dc:creator><pubDate>Sun, 19 Mar 2006 12:58:17 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereiche on Sun, 19 Mar 2006 13:25:18 GMT]]></title><description><![CDATA[<p>Danke für die Tips!</p>
<p>mantiz schrieb:</p>
<blockquote>
<p>Jop, in solch' einem Fall sollte man wohl Referenzzählung verwenden.</p>
<p>Das Objekt von Klasse1 wird ganz normal auf dem Heap platziert, aber das Objekt der Klasse SmartPtr&lt;Klasse1&gt; landet auf dem Stack, also wird der Dtor aufgerufen, sobald das Objekt vom SmartPtr&lt;Klasse1&gt; den Gültigkeitsbereich verlässt, dort wird dann delete aufgerufen.<br />
Jetzt kann man in der Klasse noch nen Member einfügen, der bei jedem neuen Zeiger erhöht wird und im Dtor runterzählt und erst, wenn der Zähler auf 0 steht, dann wird delete aufgerufen.</p>
</blockquote>
<p>Ohne den würde ja das Objekt entfernt, wenn ich den SmartPointer aus der Methode, in der er erzeugt wurde einer anderen Klasse übergebe und die Methode dann verlasse, oder?</p>
<p>Wie sieht denn so ein Zähler codemäßig aus, d.h. wo ist er zu platzieren?</p>
<p>[/quote]<br />
Dann kann man noch Operatoren überladen, irgendwie muss man ja auch auf das Objekt zugreifen, welches im SmartPtr gehalten wird. :)[/quote]</p>
<p>Liefert der Standard autopointer schon so eine Funktionalität mit Referenzzählung? Muss ich doch noch mal wühlen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1019637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1019637</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Sun, 19 Mar 2006 13:25:18 GMT</pubDate></item></channel></rss>