<?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[new- Pointer Cast]]></title><description><![CDATA[<p>Hallo zusammen,<br />
eine kurze Frage.Ich habe folgendes:</p>
<pre><code class="language-cpp">void pointerFun(){
Matrix *ma = new Matrix[3];
ma[0] = Matrix(3,3, &quot;st1&quot;); // Gewohnter zugriff

// folgendes will ich probieren (was scheibar auch funktioniert):
ma[2] = (Matrix)(*(new Matrix(6,6, &quot;Name der Matrix&quot;))); // ist das gleiche wie darunter?
((Matrix)ma[2]) = *(new Matrix(6,6, &quot;Name der Matrix&quot;));
/* 
Ich lasse mir beim Destruktoraufruf den Namen der aktuellen Matrix ausgeben; so kann ich die Matritzen in der Konsole besser zuordnen.
*/
}
</code></pre>
<p>Zu ma[2] = (Matrix)(*(new Matrix(6,6, &quot;Name der Matrix&quot;)));:<br />
Ich allokiere mir also Speicher vom Heap wenn ich mit new ein neues Matrix Objekt erzeuge. Mache ich das so, wird der allokierte Speicher nach verlassen der Methode pointerFun{...} nicht wieder freigegeben. Ich muss delete anwenden.</p>
<p>FRAGE 1: Warum muss ich an dieser Stelle casten? Ich dachte void* Pointer werden nur bei C zurückgegeben und ab C++ sind die gelieferten Pointer welche auf den Speicher für das Objekt im Heap zeigen mit dem selben Datentyp wie das Objekt definiert und ein Cast ist nicht mehr nötig?</p>
<p>FRAGE 2: Warum geht folgendes nicht (Quasi obiges ohne Cast):<br />
ma[2] = *(new Matrix(6,6, &quot;Name der Matrix&quot;)); // geht scheibar nicht<br />
ma ist der Pointer auf das Array vom Typ Matrix, durch [] derefernziere ich und erhalte die Stelle im Speicher, an welcher ein Matrix Objekt abgelegt werden kann. Durch *(new...) bekomme ich das passende objekt für diese Stelle?</p>
<p>FRAGE3: Gibt es einen Unterschied zwischen:<br />
ma[2] = *(new Matrix(6,6, &quot;Name der Matrix&quot;));<br />
und<br />
ma[0] = Matrix(3,3, &quot;st1&quot;);<br />
Ich dachte das sei das selbe?</p>
<p>Zu ma[0] = Matrix(3,3, &quot;st1&quot;);:<br />
Ich allokiere Speicher innerhalb der Methode in einer lokalen Variable vom Stack. Variablen, welche auf diese Art allokiert werden, werden automatisch nach Ende der Methode zerstört (autom. Destruktor- Aufruf).</p>
<p>Stimmt das eurer Meinung nach wie ich das alles beschrieben hab? <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="🙂"
    /><br />
Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302299/new-pointer-cast</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 08:40:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302299.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Apr 2012 20:06:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to new- Pointer Cast on Sun, 15 Apr 2012 20:06:30 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
eine kurze Frage.Ich habe folgendes:</p>
<pre><code class="language-cpp">void pointerFun(){
Matrix *ma = new Matrix[3];
ma[0] = Matrix(3,3, &quot;st1&quot;); // Gewohnter zugriff

// folgendes will ich probieren (was scheibar auch funktioniert):
ma[2] = (Matrix)(*(new Matrix(6,6, &quot;Name der Matrix&quot;))); // ist das gleiche wie darunter?
((Matrix)ma[2]) = *(new Matrix(6,6, &quot;Name der Matrix&quot;));
/* 
Ich lasse mir beim Destruktoraufruf den Namen der aktuellen Matrix ausgeben; so kann ich die Matritzen in der Konsole besser zuordnen.
*/
}
</code></pre>
<p>Zu ma[2] = (Matrix)(*(new Matrix(6,6, &quot;Name der Matrix&quot;)));:<br />
Ich allokiere mir also Speicher vom Heap wenn ich mit new ein neues Matrix Objekt erzeuge. Mache ich das so, wird der allokierte Speicher nach verlassen der Methode pointerFun{...} nicht wieder freigegeben. Ich muss delete anwenden.</p>
<p>FRAGE 1: Warum muss ich an dieser Stelle casten? Ich dachte void* Pointer werden nur bei C zurückgegeben und ab C++ sind die gelieferten Pointer welche auf den Speicher für das Objekt im Heap zeigen mit dem selben Datentyp wie das Objekt definiert und ein Cast ist nicht mehr nötig?</p>
<p>FRAGE 2: Warum geht folgendes nicht (Quasi obiges ohne Cast):<br />
ma[2] = *(new Matrix(6,6, &quot;Name der Matrix&quot;)); // geht scheibar nicht<br />
ma ist der Pointer auf das Array vom Typ Matrix, durch [] derefernziere ich und erhalte die Stelle im Speicher, an welcher ein Matrix Objekt abgelegt werden kann. Durch *(new...) bekomme ich das passende objekt für diese Stelle?</p>
<p>FRAGE3: Gibt es einen Unterschied zwischen:<br />
ma[2] = *(new Matrix(6,6, &quot;Name der Matrix&quot;));<br />
und<br />
ma[0] = Matrix(3,3, &quot;st1&quot;);<br />
Ich dachte das sei das selbe?</p>
<p>Zu ma[0] = Matrix(3,3, &quot;st1&quot;);:<br />
Ich allokiere Speicher innerhalb der Methode in einer lokalen Variable vom Stack. Variablen, welche auf diese Art allokiert werden, werden automatisch nach Ende der Methode zerstört (autom. Destruktor- Aufruf).</p>
<p>Stimmt das eurer Meinung nach wie ich das alles beschrieben hab? <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="🙂"
    /><br />
Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202311</guid><dc:creator><![CDATA[MatzeOneOSix]]></dc:creator><pubDate>Sun, 15 Apr 2012 20:06:30 GMT</pubDate></item><item><title><![CDATA[Reply to new- Pointer Cast on Sun, 15 Apr 2012 21:07:27 GMT]]></title><description><![CDATA[<p>MatzeOneOSix schrieb:</p>
<blockquote>
<pre><code class="language-cpp">ma[2] = (Matrix)(*(new Matrix(6,6, &quot;Name der Matrix&quot;)));
</code></pre>
</blockquote>
<p>Das ist ein sofortiges Speicherleck, und der Cast nimmt dich um drei Ecken. Du forderst ein Objekt auf dem Heap an, merkst dir aber seine Adresse nicht. Dann castest du den Kram von Matrix&amp; nach Matrix, wodurch eine temporäre Kopie erzeugt wird (die der Compiler allerdings wegoptimieren darf) und weist deren Inhalt einem bestehenden Objekt ma[2], das du ein paar Zeilen weiter oben angefordert hast, zu. Da du dir den Zeiger auf das Heap-Objekt nicht merkst, ist der da angeforderte Speicher sofort verloren.</p>
<p>Ich vermute, dass du von Java, C# o.ä. herkommst; man kann die Denkweise darin noch grob erkennen. <strong>Merke:</strong> Objekte sind in C++ keine Referenztypen! Mit</p>
<pre><code class="language-cpp">Matrix *ma = new Matrix[3];
</code></pre>
<p>erzeugst du bereits drei Matrix-Objekte in einem Array auf dem Heap; es ist weder erforderlich noch sinnvoll, das später nachholen zu wollen. Übrigens nimmt man dafür besser</p>
<pre><code class="language-cpp">std::vector&lt;Matrix&gt; ma(3);
</code></pre>
<p>...dann muss man sich nicht selbst um die Aufräumarbeit kümmern (Stichwort RAII). Wenn die Länge zur Compilezeit bekannt ist, geht auch</p>
<pre><code class="language-cpp">Matrix ma[3];
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::array&lt;Matrix, 3&gt; ma;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2202341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202341</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 15 Apr 2012 21:07:27 GMT</pubDate></item><item><title><![CDATA[Reply to new- Pointer Cast on Sun, 15 Apr 2012 21:37:55 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Dann castest du den Kram von Matrix&amp; nach Matrix, wodurch eine temporäre Kopie erzeugt wird (die der Compiler allerdings wegoptimieren darf)</p>
</blockquote>
<p>Das ist kein Fall für copy elision. Das Original ist kein temporäres Objekt, und der Cast-Ausdruck selbst wird in einer Zuweisung verwendet (könnte allerdings eine Move-Zuweisung sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202353</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 15 Apr 2012 21:37:55 GMT</pubDate></item><item><title><![CDATA[Reply to new- Pointer Cast on Mon, 16 Apr 2012 05:56:59 GMT]]></title><description><![CDATA[<p>Guten Morgen und Danke schonmal!<br />
Ich gebe das jetzt nochmal so wieder wie ich es verstanden habe. Die Frage ist, ob seldon das auch so meinte <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>Diese Zeile<br />
ma[2] = (Matrix)(*(new Matrix(6,6, &quot;Matrix Name&quot;)));<br />
ist schlecht, da:<br />
new Matrix besorgt Speicher und liefert Pointer drauf zurück. ma[2] hat bereits ein instanziiertes Matrix Objekt drin. Durch den Zuweisungsoperator (=) wird vom Compiler eine Bitweise (Flache) Kopie erzeugt. Dabei tritt der Effekt auf, dass ich aber immernoch auf die Referenzen des durch new erzeugten Objektes mit ma[2] zugreifen und somit auch verwenden kann, bzw das bei weiterem Zugriff durch ma[2] aktiv tue.</p>
<p>Bei verlassen der Methode void pointerFun(){...} wird das Matrix Objekt hinter ma[2] normal gelöscht (vom Stack), dass mit new erstellte Matrix Objekt aber nicht. Den zeiger darauf habe ich bereits bei der Zuweisung zu ma[2] verloren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202385</guid><dc:creator><![CDATA[MatzeOneOSix]]></dc:creator><pubDate>Mon, 16 Apr 2012 05:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to new- Pointer Cast on Mon, 16 Apr 2012 08:48:24 GMT]]></title><description><![CDATA[<p>Achtung, nicht persönlich nehmen: Aber Du hast Dir da einen ganz schönen Mist angewöhnt.</p>
<p>Was soll das &quot;(Matrix)&quot; da überall?</p>
<p>MatzeOneOSix schrieb:</p>
<blockquote>
<p>FRAGE 1: Warum muss ich an dieser Stelle casten? Ich dachte void* Pointer werden nur bei C zurückgegeben und ab C++ sind die gelieferten Pointer welche auf den Speicher für das Objekt im Heap zeigen mit dem selben Datentyp wie das Objekt definiert und ein Cast ist nicht mehr nötig?</p>
</blockquote>
<p>Richtig gedacht. Da musst Du wohl noch etwas anderes falsch gemacht haben.</p>
<p>MatzeOneOSix schrieb:</p>
<blockquote>
<p>FRAGE 2: Warum geht folgendes nicht (Quasi obiges ohne Cast):<br />
ma[2] = *(new Matrix(6,6, &quot;Name der Matrix&quot;)); // geht scheibar nicht<br />
ma ist der Pointer auf das Array vom Typ Matrix, durch [] derefernziere ich und erhalte die Stelle im Speicher, an welcher ein Matrix Objekt abgelegt werden kann. Durch *(new...) bekomme ich das passende objekt für diese Stelle?</p>
</blockquote>
<p>müsste so gehen, obwohl du natürlich sofort ein Speicherleck bekommst, da du per new ein Objekt anlegst, es kopierst, die Addresse darauf vergisst und das Original noch im Speicher hängen bleibt.</p>
<p>MatzeOneOSix schrieb:</p>
<blockquote>
<p>FRAGE3: Gibt es einen Unterschied zwischen:<br />
ma[2] = *(new Matrix(6,6, &quot;Name der Matrix&quot;));<br />
und<br />
ma[0] = Matrix(3,3, &quot;st1&quot;);<br />
Ich dachte das sei das selbe?</p>
</blockquote>
<p>Ja das ist unterschiedlich. Nein, das ist nicht dasselbe.</p>
<p>MatzeOneOSix schrieb:</p>
<blockquote>
<p>Zu ma[0] = Matrix(3,3, &quot;st1&quot;);:<br />
Ich allokiere Speicher innerhalb der Methode in einer lokalen Variable vom Stack. Variablen, welche auf diese Art allokiert werden, werden automatisch nach Ende der Methode zerstört (autom. Destruktor- Aufruf).</p>
</blockquote>
<p>Das hast Du richtig erkannt. *new Matrix(...) legt das Ding aber nicht im automatischen Speicher an, sondern im Freispeicher, wo es nicht automatisch wieder gelöscht wird. Also: Speicherleck</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

...

void erst_mal_mit_krabbeln_anfangen()
{
  vector&lt;Matrix&gt; vec;
  vec.reserve(2);
  vec.emplace_back(3,3,&quot;str&quot;);             // C++2011
  vec.emplace_back(6,6,&quot;Name der Matrix&quot;); // C++2011
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

...

void erst_mal_mit_krabbeln_anfangen()
{
  vector&lt;Matrix&gt; vec (2);

  vec[0] = Matrix(3,3,&quot;str&quot;); // Zuweisung

  // oder
  vec[1].reset(6,6,&quot;Name der Matrix&quot;); 
  // falls die Matrix-Klasse eine entsprechende
  // reset-Funktion besitzt.
}
</code></pre>
<p>Zu jedem new gehört ein delete. Zu jedem new[] gehört ein delete[]. Mittlerweile sind wir bei C++ so weit, dass wir delete[] und delete nur ganz ganz selten selbst schreiben müssen, weil wir entweder die Verantwortung zum Löschen sofort an ein schlaues Objekt abtreten (smart pointer) oder weil wir gleich einen passenden Container nehmen können, wie z.B. vector. Man kann also an wirklich vielen Stellen durch einen modernen Stil new[], delete[] und delete vermeiden, ohne dass dadurch Speicherlecks entstehen.</p>
<p>MatzeOneOSix schrieb:</p>
<blockquote>
<p>Diese Zeile<br />
ma[2] = (Matrix)(*(new Matrix(6,6, &quot;Matrix Name&quot;)));<br />
ist schlecht, da:<br />
new Matrix besorgt Speicher und liefert Pointer drauf zurück.</p>
</blockquote>
<p>Soweit richtig.</p>
<p>MatzeOneOSix schrieb:</p>
<blockquote>
<p>ma[2] hat bereits ein instanziiertes Matrix Objekt drin. Durch den Zuweisungsoperator (=) wird vom Compiler eine Bitweise (Flache) Kopie erzeugt.</p>
</blockquote>
<p>Jain. Wenn Du keinen eigenen Zuweisungsoperator definiert hast, versucht der Compiler hier elementweise zuzuweisen. Was dabei passiert, hängt natürlich von den Elementtypen an und ob deren Zuweisungsoperator überschrieben wurde und so weiter. Wenn Du also Deine Matrixelemente in der Klasse in einem std::vector speicherst, wird natürlich KEINE &quot;flache Kopie&quot; erzeugt, da der Zuweisungsoperator des vectors die Elemente auch kopiert.</p>
<p>MatzeOneOSix schrieb:</p>
<blockquote>
<p>Dabei tritt der Effekt auf, dass ich aber immernoch auf die Referenzen des durch new erzeugten Objektes mit ma[2] zugreifen und somit auch verwenden kann, bzw das bei weiterem Zugriff durch ma[2] aktiv tue.</p>
</blockquote>
<p>Nicht wirklich. Was für Referenzen? Wo sind denn da Referenzen? Nach der Zuweisung hast Du keine Möglichkeit mehr, auf das im Freispeicher erzeugte Objekt zuzugreifen, weil Du Dir ja nicht mal die Adresse darauf merkst. Ich befürchte, Du verstehst das C++ Objekt-Modell nicht. Es zwingt Dir nicht, wie es andere Sprachen gern tun, eine Indirektion auf (z.B. &quot;Referezen&quot; in Java und Python).</p>
<p>MatzeOneOSix schrieb:</p>
<blockquote>
<p>Bei verlassen der Methode void pointerFun(){...} wird das Matrix Objekt hinter ma[2] normal gelöscht (vom Stack), dass mit new erstellte Matrix Objekt aber nicht. Den zeiger darauf habe ich bereits bei der Zuweisung zu ma[2] verloren.</p>
</blockquote>
<p>Das klingt richtig. Aber so ganz sitzt das noch nicht, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202413</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 16 Apr 2012 08:48:24 GMT</pubDate></item><item><title><![CDATA[Reply to new- Pointer Cast on Wed, 18 Apr 2012 09:49:37 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure Unterstützung! <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/2203166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203166</guid><dc:creator><![CDATA[MatzeOneOSix]]></dc:creator><pubDate>Wed, 18 Apr 2012 09:49:37 GMT</pubDate></item></channel></rss>