<?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[Rückgabe eines Pointers]]></title><description><![CDATA[<p>Hallo. Hier nochmal eine (möglicherweise) doofe Frage:</p>
<p>Eine Funktion arbeitet mit bestimmten Daten, die ich dynamisch alloziere. Dabei möchte ich das Reservieren des Speichers auslagern. In etwa so</p>
<pre><code class="language-cpp">void MyClass::init(MyType1* my1, MyType2* my2)
{
  my1 = new MyType1;
  my2 = new MyType2;
}

void MyClass::run()
{
  MyType1* my1 = NULL;
  MyType2* my2 = NULL;

  init( my1, my2 );

  /* Problem: An dieser Stelle sind my1 und my2 immernoch NULL */
}
</code></pre>
<p>Was mache ich hier falsch bzw. wo genau liegt der Denkfehler? Gibt es sowas wie Call-By-Reference für Pointer?</p>
<p>Gruss. mbu.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187903/rückgabe-eines-pointers</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 21:59:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187903.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jul 2007 11:32:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rückgabe eines Pointers on Wed, 25 Jul 2007 11:32:50 GMT]]></title><description><![CDATA[<p>Hallo. Hier nochmal eine (möglicherweise) doofe Frage:</p>
<p>Eine Funktion arbeitet mit bestimmten Daten, die ich dynamisch alloziere. Dabei möchte ich das Reservieren des Speichers auslagern. In etwa so</p>
<pre><code class="language-cpp">void MyClass::init(MyType1* my1, MyType2* my2)
{
  my1 = new MyType1;
  my2 = new MyType2;
}

void MyClass::run()
{
  MyType1* my1 = NULL;
  MyType2* my2 = NULL;

  init( my1, my2 );

  /* Problem: An dieser Stelle sind my1 und my2 immernoch NULL */
}
</code></pre>
<p>Was mache ich hier falsch bzw. wo genau liegt der Denkfehler? Gibt es sowas wie Call-By-Reference für Pointer?</p>
<p>Gruss. mbu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332192</guid><dc:creator><![CDATA[mbu]]></dc:creator><pubDate>Wed, 25 Jul 2007 11:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe eines Pointers on Wed, 25 Jul 2007 11:36:20 GMT]]></title><description><![CDATA[<p>mbu schrieb:</p>
<blockquote>
<p>Was mache ich hier falsch bzw. wo genau liegt der Denkfehler?</p>
</blockquote>
<p>Du übergibst die Zeiger per Wert - das heißt die Zuweisungen haben keinen Effekt nach außen.</p>
<blockquote>
<p>Gibt es sowas wie Call-By-Reference für Pointer?</p>
</blockquote>
<p>Ja - das sieht dann so aus: <code>void MyClass::init(MyType1*&amp; my1, MyType2*&amp; my2)</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332195</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 25 Jul 2007 11:36:20 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe eines Pointers on Wed, 25 Jul 2007 11:37:57 GMT]]></title><description><![CDATA[<p>Wenn du das wirklich so machen willst, was ziemlich sicher Mist ist, dann<br />
musst du deine Pointer natürlich als Referenzen übergeben.</p>
<p>Jockel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332198</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Wed, 25 Jul 2007 11:37:57 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe eines Pointers on Wed, 25 Jul 2007 11:40:39 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Grossartig. Wieder was gelernt. Vielen Dank. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> <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>Jockelx schrieb:</p>
<blockquote>
<p>Wenn du das wirklich so machen willst, was ziemlich sicher Mist ist, dann<br />
musst du deine Pointer natürlich als Referenzen übergeben.</p>
</blockquote>
<p>Warum sollte das Mist sein? Wenn ich eine Methode (wie oben run) habe, die einen bestimmten Algorithmus durchläuft und ich die Methode etwas übersichtlicher gestalten will, weil eben auch die Initialisierung etwas länger ist, kann ich doch nichts anderes machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332199</guid><dc:creator><![CDATA[mbu]]></dc:creator><pubDate>Wed, 25 Jul 2007 11:40:39 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe eines Pointers on Wed, 25 Jul 2007 11:59:56 GMT]]></title><description><![CDATA[<p>Naja, &quot;Mist&quot; ist vielleicht ein etwas harter Ausdruck.</p>
<p>Das Problem liegt einfach darin, dass &quot;Ownership&quot; nicht klar ist. Sprich: Ist gewährleistet, dass die Objekte korrekt (zuverlässig und nur einmal) abgeräumt werden ? ... und dass init() nur einmal aufgerufen wird ? ... und nicht auf anderem Wege versehentlich Speicher &quot;vergessen&quot; wird ? ...</p>
<p>Brauchst Du eigentlich wirklich das Zeug auf dem Heap ? Oder reichen nicht auch &quot;Stackvariablen&quot;.</p>
<p>GGf. würde ich eine Wrapperklasse drumrumstricken:</p>
<pre><code class="language-cpp">struct MyVars {
   MyType1* my1;
   MyType2* my2;
   MyVars() : my1(new MyType1), my2(new MyType2) {}
   ~MyVars() { delete my2; delete my1; }
private: // Kopieren verbieten ... sonst Gedanken drüber machen.
   MyVars(MyVars const&amp;);
   operator=(MyVars const&amp;);
};

void MyClass::run() {
  MyVars v;

  // Hier kannst Du mit v.my1-&gt;, v.my2-&gt; arbeiten wie Du willst.
  // Am Ende (egfal ob return oder throw/catch räumt der MyVars-Destruktor auf
}
</code></pre>
<p>Aber wie gesagt: Ich würde nur aus wirklich gutem Grund mit new/delete arbeiten und sonst einfach auf dem Stack:</p>
<pre><code class="language-cpp">void MyClass::run() {
   MyType1 my1;
   MyType2 my2;

   // direkt mit my1. und my2. arbeiten ... Aufräumen, Kopieren, ..l alles kein Problem.
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332224</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 25 Jul 2007 11:59:56 GMT</pubDate></item></channel></rss>