<?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[Objekte als Parameter über new]]></title><description><![CDATA[<p>Aloha-he zusammen,</p>
<p>beim durchstöbern einiger älteren Codezeilen von mir, bin ich auf eine Parameterübergabe gestoßen, die sich C# ähnlich anmutet, mir jedoch unter C++ einiges an Kopfzerbrechen bereitet, bezüglich Stil und Speicher.</p>
<p>Da mir meine dazu erdachten Stichwörter leider weder bei Google noch innerhalb der Forensuche wirklich weitergeholfen haben, beschreibe ich das Problem in einem neuen Beitrag.</p>
<p>Folgende Situation:</p>
<pre><code class="language-cpp">class cAnyClass
{ 
// ...
public:
    cAnyClass(int i) { /* ... */ }
}

void foo(cAnyClass&amp; o)
{
// irgendwas mit o tun
}

int main()
{
    int i = 0;
    foo(new cAnyClass(i));
    // ...
}
</code></pre>
<p>Nun, jenes, beim Aufruf von foo erstellte, Objekt, lebt nun bis foo ausgeführt wurde?<br />
Soweit ich das verstanden habe wird das Objekt auf dem Heap erzeugt...? Was gibt es dazu zu sagen?</p>
<p>Im Grunde geht es mir darum: Sind solche Parameterübergaben eher zu vermeiden? Oder ist ein solches Design erstrebenswert? Wieso nicht, wieso doch? <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>
<p>Soweit,</p>
<p>kausa</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261629/objekte-als-parameter-über-new</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 04:31:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261629.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Feb 2010 17:44:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekte als Parameter über new on Sun, 21 Feb 2010 17:44:02 GMT]]></title><description><![CDATA[<p>Aloha-he zusammen,</p>
<p>beim durchstöbern einiger älteren Codezeilen von mir, bin ich auf eine Parameterübergabe gestoßen, die sich C# ähnlich anmutet, mir jedoch unter C++ einiges an Kopfzerbrechen bereitet, bezüglich Stil und Speicher.</p>
<p>Da mir meine dazu erdachten Stichwörter leider weder bei Google noch innerhalb der Forensuche wirklich weitergeholfen haben, beschreibe ich das Problem in einem neuen Beitrag.</p>
<p>Folgende Situation:</p>
<pre><code class="language-cpp">class cAnyClass
{ 
// ...
public:
    cAnyClass(int i) { /* ... */ }
}

void foo(cAnyClass&amp; o)
{
// irgendwas mit o tun
}

int main()
{
    int i = 0;
    foo(new cAnyClass(i));
    // ...
}
</code></pre>
<p>Nun, jenes, beim Aufruf von foo erstellte, Objekt, lebt nun bis foo ausgeführt wurde?<br />
Soweit ich das verstanden habe wird das Objekt auf dem Heap erzeugt...? Was gibt es dazu zu sagen?</p>
<p>Im Grunde geht es mir darum: Sind solche Parameterübergaben eher zu vermeiden? Oder ist ein solches Design erstrebenswert? Wieso nicht, wieso doch? <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>
<p>Soweit,</p>
<p>kausa</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859192</guid><dc:creator><![CDATA[kausalitaetsfalle]]></dc:creator><pubDate>Sun, 21 Feb 2010 17:44:02 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte als Parameter über new on Sun, 21 Feb 2010 17:59:09 GMT]]></title><description><![CDATA[<p>Eigentlich kann nan erst drüber reden, wenn es klappt. Ob Zeiger oder Referenz ist doch ein erheblicher Unterschied.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859198</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 21 Feb 2010 17:59:09 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte als Parameter über new on Sun, 21 Feb 2010 18:00:22 GMT]]></title><description><![CDATA[<p>Das ist nicht gut, sofern du nicht explizit vorhast die Verantwortung des Objektes an die Funktion zu übergeben, was eher weniger der Fall ist. (Bei smart Pointer macht man das üblicherweise im Konstruktor des smart Pointers)</p>
<p>Im übrigen geht das sowieso nicht, weil du einen Zeiger übergibst, aber die Funktion erwartet eine Referenz.</p>
<p>Man macht eher so etwas:</p>
<pre><code class="language-cpp">class cAnyClass
{
// ...
public:
    cAnyClass(int i) { /* ... */ }
}

void foo(cAnyClass* o) // beachte * nicht &amp;!
{
// irgendwas mit o tun
}

int main()
{
    int i = 0;
    cAnyClass* p = new cAnyClass ( i );

    foo( p );
    // ...

    delete p; // Speicher freigeben!
}
</code></pre>
<p>Die Funktion erwartet ja lediglich einen Zeiger auf cAnyClass. Man kann also auch einfach einen Zeiger auf ein automatisches Objekt übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859199</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 21 Feb 2010 18:00:22 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte als Parameter über new on Sun, 21 Feb 2010 18:32:38 GMT]]></title><description><![CDATA[<p>Vielen Dank!</p>
<p>In Folge dessen also lieber einige Zeilen mehr investieren.</p>
<p>Edit:</p>
<p>Moment!</p>
<blockquote>
<p>... auf ein automatisches Objekt übergeben</p>
</blockquote>
<p>Was ist damit nun gemeint? Also wenn man meinen Fehler korrigiert und aus der Referenz einen Pointer zaubert, wäre meine Variante wieder in Ordnung?</p>
<p>Nehmen wir an, das Objekt wird nur innerhalb der Methode benötigt... wie verhält es sich dann?<br />
Wie ist es, wenn ich das Objekt an ein anderes Objekt übergebe, müsste ich es dann von Hand löschen?</p>
<pre><code class="language-cpp">class cFirstClass
{
    // ...
}

class cSecondClass
{
 private:
    cFirstClass * fancyPointer;
 public:
    void DoWeirdThings(cFirstClass * p) { fancyPointer = p; }
 // ...
}

int main()
{
   cSecondClass obj();
   obj.DoWeirdThings(new cFirstClass(...));
}
</code></pre>
<p>Wo stirbt nun mein &quot;automatisches(?)&quot; Objekt?</p>
<p>Gruß,</p>
<p>kausa</p>
<p>PS: Ich hoffe es hat sich nicht wieder ein ähnlicher Fehler wie oben eingeschlichen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859212</guid><dc:creator><![CDATA[kausalitaetsfalle]]></dc:creator><pubDate>Sun, 21 Feb 2010 18:32:38 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte als Parameter über new on Sun, 21 Feb 2010 18:27:02 GMT]]></title><description><![CDATA[<p>Das Zeug auf dne Stack legen könnte hier sinnvoller sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859215</guid><dc:creator><![CDATA[füüüsssse]]></dc:creator><pubDate>Sun, 21 Feb 2010 18:27:02 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte als Parameter über new on Sun, 21 Feb 2010 18:43:19 GMT]]></title><description><![CDATA[<p>kausalitaetsfalle schrieb:</p>
<blockquote>
<p>beim durchstöbern einiger älteren Codezeilen von mir, bin ich auf eine Parameterübergabe gestoßen, die sich C# ähnlich anmutet, mir jedoch unter C++ einiges an Kopfzerbrechen bereitet, bezüglich Stil und Speicher.</p>
</blockquote>
<p>Tipp: Programmiere nicht in C++ wie in C#. Sowas geht nach hinten los. --&gt; <em>Umdenken</em> (geht nicht von heute auf morgen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1859220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859220</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 21 Feb 2010 18:43:19 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte als Parameter über new on Sun, 21 Feb 2010 19:05:08 GMT]]></title><description><![CDATA[<p>kausalitaetsfalle schrieb:</p>
<blockquote>
<blockquote>
<p>... auf ein automatisches Objekt übergeben</p>
</blockquote>
<p>Was ist damit nun gemeint? Also wenn man meinen Fehler korrigiert und aus der Referenz einen Pointer zaubert, wäre meine Variante wieder in Ordnung?</p>
<p>Nehmen wir an, das Objekt wird nur innerhalb der Methode benötigt... wie verhält es sich dann?<br />
Wie ist es, wenn ich das Objekt an ein anderes Objekt übergebe, müsste ich es dann von Hand löschen?</p>
</blockquote>
<p>Nein. Es ist auch nicht in Ordnung.</p>
<p>Deine Variante kann lediglich korrekt arbeiten, wenn die Funktion selbst dann den Speicher wieder frei gibt. Dann hast du aber ein Problem, dass die Übergabe ein automatisches Objekt sein könnte, was kein delete braucht und dann hast du ein Problem.</p>
<pre><code class="language-cpp">class cAnyClass
{
// ...
public:
    cAnyClass(int i) { /* ... */ }
}

void foo(cAnyClass* o) // beachte * nicht &amp;!
{
// irgendwas mit o tun
 delete o; // zerstöre o -&gt; eigl. schlechtes Design!
}

int main()
{
    int i = 0;
    cAnyClass* p = new cAnyClass ( i );
    foo( p ); // ok

    cAnyClass object;
    foo ( &amp;object ); // hups delete auf object? -&gt; keine gute Idee

}// hier wird object korrekt zerstört
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1859230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1859230</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 21 Feb 2010 19:05:08 GMT</pubDate></item></channel></rss>