<?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[Dynamische Klassen]]></title><description><![CDATA[<p>Moin,</p>
<p>Anfänger Frage: Warum lässt mein Compiler eine solche Kompilierung zu?</p>
<pre><code>[b]NeueListe *a[2];[/b]
a[0] = new NeueListe;
a[1] = new NeueListe;
a[2] = new NeueListe;
[b]a[3] = new NeueListe;[/b]
</code></pre>
<p>Müsste es bei a[3] keinen Fehler geben? Danke für die Antworten.</p>
<p>Chrille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307598/dynamische-klassen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 16:00:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307598.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Aug 2012 20:05:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dynamische Klassen on Thu, 30 Aug 2012 20:05:02 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>Anfänger Frage: Warum lässt mein Compiler eine solche Kompilierung zu?</p>
<pre><code>[b]NeueListe *a[2];[/b]
a[0] = new NeueListe;
a[1] = new NeueListe;
a[2] = new NeueListe;
[b]a[3] = new NeueListe;[/b]
</code></pre>
<p>Müsste es bei a[3] keinen Fehler geben? Danke für die Antworten.</p>
<p>Chrille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247149</guid><dc:creator><![CDATA[chrille]]></dc:creator><pubDate>Thu, 30 Aug 2012 20:05:02 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Thu, 30 Aug 2012 20:15:32 GMT]]></title><description><![CDATA[<p>Das hat nichst mit dynamischen Klassen zu tun und das ist dem Compiler völlig egal. Das mag zur Laufzeit crashen (nicht unbedingt), weil das auf jeden Fall ein böser Fehler ist und zu undefiniertem Verhalten führt. Aber für den Compiler ist der Code völlig korrekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247151</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Thu, 30 Aug 2012 20:15:32 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Thu, 30 Aug 2012 20:16:30 GMT]]></title><description><![CDATA[<p>chrille schrieb:</p>
<blockquote>
<p>Moin,</p>
<p>Anfänger Frage: Warum lässt mein Compiler eine solche Kompilierung zu?</p>
<pre><code>[b]NeueListe *a[2];[/b]
a[0] = new NeueListe;
a[1] = new NeueListe;
a[2] = new NeueListe;
[b]a[3] = new NeueListe;[/b]
</code></pre>
<p>Müsste es bei a[3] keinen Fehler geben? Danke für die Antworten.</p>
<p>Chrille</p>
</blockquote>
<p>Weil das ein Laufzeitfehler (wenn überhaupt) ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247152</guid><dc:creator><![CDATA[IrgendeinName]]></dc:creator><pubDate>Thu, 30 Aug 2012 20:16:30 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Thu, 30 Aug 2012 20:18:46 GMT]]></title><description><![CDATA[<p>Im übrigen ist</p>
<pre><code class="language-cpp">a[2]
</code></pre>
<p>schon falsch. In Deinem Array gibt es nur zwei gültige Einträge, nämlich</p>
<pre><code>a[0]
</code></pre>
<p>und</p>
<pre><code>a[1]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2247154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247154</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 30 Aug 2012 20:18:46 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Thu, 30 Aug 2012 20:20:28 GMT]]></title><description><![CDATA[<p>chrille schrieb:</p>
<blockquote>
<p>Anfänger Frage: Warum lässt mein Compiler eine solche Kompilierung zu?</p>
</blockquote>
<p>Der schützt dich zwar vor einigem, aber nicht vor allem - zum Beispiel nicht vor Dummheit <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="😉"
    /> Es gibt allerdings durchaus Compiler, die da statische Checks drin haben, die sowas erkennen. Clang dürfte da meckern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247156</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 30 Aug 2012 20:20:28 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Thu, 30 Aug 2012 20:24:18 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Im übrigen ist</p>
<pre><code class="language-cpp">a[2]
</code></pre>
<p>schon falsch. In Deinem Array gibt es nur zwei gültige Einträge, nämlich</p>
<pre><code>a[0]
</code></pre>
<p>und</p>
<pre><code>a[1]
</code></pre>
</blockquote>
<p>Falsch ist falsch ausgedrückt. Der Standard (hab ich grad nachgelesen im C-Standard) kategorisiert das als &quot;undefiened behaviour&quot;, also undefieniertes Verhalten.</p>
<p>D.H, das nicht vorgeschrieben ist was passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247157</guid><dc:creator><![CDATA[IrgendeinName]]></dc:creator><pubDate>Thu, 30 Aug 2012 20:24:18 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Thu, 30 Aug 2012 21:34:01 GMT]]></title><description><![CDATA[<p>Du hast ein Array mit 2 Elementen definiert, greifst aber mit (z.B. a[2]) außerhalb des definierten Arrays-Speicherbereiches zu und das ist UB.<br />
Im besten Fall erhältst du vom Compiler eine Warnung.<br />
Im zweitbesten Fall erhältst du zur Laufzeit einen Fehler.<br />
Im schlimmsten Fall erhältst du überhaupt keine Fehler/Warnung und schreibst/liest auf Speicher, der anderweitig Verwendung findet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247168</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Thu, 30 Aug 2012 21:34:01 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Thu, 30 Aug 2012 21:13:11 GMT]]></title><description><![CDATA[<p>Wutz schrieb:</p>
<blockquote>
<p>Im schlimmsten Fall erhälst du überhaupt keine Fehler/Warnung und schreibst/liest auf Speicher, der anderweitig Verwendung findet.</p>
</blockquote>
<p>Ja, genau das passiert hier offenbar. Ich war irritiert, dass während der Laufzeit kein Fehler ausgegeben wird, und man den undefinierten Bereich einfach so verwenden kann. Danke für eure Antworten. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2247176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247176</guid><dc:creator><![CDATA[chrille]]></dc:creator><pubDate>Thu, 30 Aug 2012 21:13:11 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Thu, 30 Aug 2012 21:24:16 GMT]]></title><description><![CDATA[<p>chrille schrieb:</p>
<blockquote>
<p>Ich war irritiert, dass während der Laufzeit kein Fehler ausgegeben wird, und man den undefinierten Bereich einfach so verwenden kann. Danke für eure Antworten. <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>
</blockquote>
<p>Im Gegensatz zu gewissen anderen Sprachen, geht C++ davon aus, dass der Programmierer weiß was er tut und verschwendet daher keine Zeit damit, zur Laufzeit ständig nachzuschauen, ob die Kinder auch alle brav im Bett sind. <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/2247180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247180</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 30 Aug 2012 21:24:16 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Fri, 31 Aug 2012 06:39:40 GMT]]></title><description><![CDATA[<p>IrgendeinName schrieb:</p>
<blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>Im übrigen ist</p>
<pre><code class="language-cpp">a[2]
</code></pre>
<p>schon falsch. In Deinem Array gibt es nur zwei gültige Einträge, nämlich</p>
<pre><code>a[0]
</code></pre>
<p>und</p>
<pre><code>a[1]
</code></pre>
</blockquote>
<p>Falsch ist falsch ausgedrückt. Der Standard (hab ich grad nachgelesen im C-Standard) kategorisiert das als &quot;undefiened behaviour&quot;, also undefieniertes Verhalten.</p>
<p>D.H, das nicht vorgeschrieben ist was passiert.</p>
</blockquote>
<p>Ach so, das ist natürlich was anderes, dann ist es ja doch richtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247223</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 31 Aug 2012 06:39:40 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Fri, 31 Aug 2012 12:25:07 GMT]]></title><description><![CDATA[<p>chrille schrieb:</p>
<blockquote>
<pre><code>[b]NeueListe *a[2];[/b]
a[0] = new NeueListe;
a[1] = new NeueListe;
a[2] = new NeueListe;
[b]a[3] = new NeueListe;[/b]
</code></pre>
<p>Müsste es bei a[3] keinen Fehler geben?</p>
</blockquote>
<p>a[2] ist ja auch schon falsch. Mit dem einen oder anderen &quot;static analysis&quot; tool, würde man den Fehler wohl finden. Vielleicht können das die Compiler auch schon auf hoher Warnstufe. Wenn du aber darauf bestehst, dass zur Laufzeit solche Fehler automatisch erkannt werden, dann ist C++ nicht die richtige Sprache für dich.</p>
<p>In gewissen Grenzen ist aber eine optionale Prüfung (z.B. für den Debug-Modus) typischerweise möglich. Du musst nur stattdessen benutzerdefinierte Typen verwenden, die solche Debug-Modi anbieten. Rohe C-Arrays tun das nicht. Aber eine gescheite Implementierung der Standardbibliothek bietet solche Debug-Modi an, bei der dann</p>
<pre><code class="language-cpp">std::array&lt;NeueListe*,2&gt; a;
a[0] = new NeueListe;
a[1] = new NeueListe;
a[2] = new NeueListe; // hier im Debug-Modus ein out-of-bounds-Check zur Laufzeit zu erwarten ist
</code></pre>
<p>Am besten guckste mal in deine Compiler-Doku rein, ob es sowas gibt, und wenn ja, wie man das aktiviert.</p>
<p>Außerdem solltest du mal nach RAII googeln. Delegiere die Verantwortung zur Freigabe von Resourcen möglichst früh von dir weg. In diesem Fall könnte dir ggf. ein unique_ptr helfen:</p>
<pre><code class="language-cpp">std::array&lt;std::unique_ptr&lt;NeueListe&gt;,2&gt; a;
a[0].reset(new NeueListe);
a[1].reset(new NeueListe);
</code></pre>
<p>Der &quot;Besitz&quot; deiner dynamisch erzeugten Objekte geht an die unique_ptr-Objekte über. Die kümmern sich dann schon um die Freigabe. So kann man Speicherlecks ausschließen. In C++ ist sowas sehr wichtig. Auch wenn du irgendwo ein delete stehen hast, kommst du da vielleicht nicht mehr hin, wenn zwischendurch eine Ausnahme fliegt oder sowas...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247349</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 31 Aug 2012 12:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Klassen on Fri, 31 Aug 2012 13:33:33 GMT]]></title><description><![CDATA[<p>Du musst verstehen, dass, wenn du auf Zeiger oder Arrays den Index-Operator anwendest, du eigentlich nur eine kürzere Schreibweise für etwas anderes nutzt:</p>
<p>Angenommen <code>arr</code> sei als ein echtes Array oder als Zeiger deklariert, und <code>i</code> ist ein integraler Skalar, dann ist</p>
<pre><code class="language-cpp">arr[i]
</code></pre>
<p>exakt dasselbe wie</p>
<pre><code class="language-cpp">*(arr + i) //Also nichts anderes als Zeigerarithmetik. Hier kommt wieder das array-pointer decay ins Spiel.
</code></pre>
<p>Und hier ist das Problem: darauf zu achten, dass der Index <code>i</code> (oder ganz einfach <strong>die Adresse die man im Endeffekt deferenziert</strong>) &quot;gültig&quot; ist, ist die Aufgabe des Programmierers. Dadurch verschnellert sich der Programmablauf.</p>
<p>Was man hier auch sieht, ist die Tatsache, dass <code>i</code> semantisch gesehen auch eine negative Zahl sein kann. Dem Compiler ist das egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247375</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 31 Aug 2012 13:33:33 GMT</pubDate></item></channel></rss>