<?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[Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern]]></title><description><![CDATA[<p>Abend,</p>
<p>ich habe 2 kleine C++ Fragen (die nichts miteinander zu tun haben):</p>
<ol>
<li>Gibt es eine Möglichkeit const Variablen zu einem späteren Zeitpunkt zu initalisieren? Sagen wir ich habe einen DWORD pointer, den ich jedoch nicht bei der Definition sondern zu einem späteren Zeitpunkt A initialisieren will. Nach Zeitpunkt A soll er jedoch nie mehr geändert werden. Das einzige was mir dazu einfällt wäre sowas:</li>
</ol>
<pre><code class="language-cpp">const DWORD* foo;
// ...
foo = new DWORD[10];
const_cast&lt;DWORD*&gt;(foo)[0] = 2;
</code></pre>
<p>Gibt es da vllt noch eine andere Möglichkeit?</p>
<ol start="2">
<li>Gibt es eine &quot;Standardlösung&quot; zum Löschen von statischen Membern? Sagen wir ich habe so eine Klasse:</li>
</ol>
<pre><code class="language-cpp">class Foo {
public:
  Foo();
  ~Foo();
  static int* p;
};
</code></pre>
<p>und nehmen wir an es gibt sehr viele Instanzen von Foo. Wenn mein Dtor nun so aussieht:</p>
<pre><code class="language-cpp">Foo::~Foo() {
   delete p;
   p=0;
   // Nicht-statische member löschen
}
</code></pre>
<p>dann wird viele tausende Male delete auf ein einen Null-Zeiger aufgerufen. Ist zwar in Ordnung, aber schöne wäre es doch, wenn das delete nur einmal aufgerufen werden würde. Dazu könnte ich eine statische lokale variable nehmen:</p>
<pre><code class="language-cpp">static bool called = false;
if(!called) {
   called = true;
   delete p;
}
</code></pre>
<p>Und alternativ könnte ich auch einen statischen &quot;Dtor&quot; anlegen: static void StaticDestructor(), der dann alle statischen Member löscht und den ich einfach manuell aufrufe.<br />
Wie löscht ihr also dynamisch allokierten Speicher, der von static Member referenziert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228937/löschen-von-static-membern-und-quot-verzögerte-quot-initialisierung-von-const-membern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 06:14:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228937.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Dec 2008 17:41:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Thu, 04 Dec 2008 17:41:57 GMT]]></title><description><![CDATA[<p>Abend,</p>
<p>ich habe 2 kleine C++ Fragen (die nichts miteinander zu tun haben):</p>
<ol>
<li>Gibt es eine Möglichkeit const Variablen zu einem späteren Zeitpunkt zu initalisieren? Sagen wir ich habe einen DWORD pointer, den ich jedoch nicht bei der Definition sondern zu einem späteren Zeitpunkt A initialisieren will. Nach Zeitpunkt A soll er jedoch nie mehr geändert werden. Das einzige was mir dazu einfällt wäre sowas:</li>
</ol>
<pre><code class="language-cpp">const DWORD* foo;
// ...
foo = new DWORD[10];
const_cast&lt;DWORD*&gt;(foo)[0] = 2;
</code></pre>
<p>Gibt es da vllt noch eine andere Möglichkeit?</p>
<ol start="2">
<li>Gibt es eine &quot;Standardlösung&quot; zum Löschen von statischen Membern? Sagen wir ich habe so eine Klasse:</li>
</ol>
<pre><code class="language-cpp">class Foo {
public:
  Foo();
  ~Foo();
  static int* p;
};
</code></pre>
<p>und nehmen wir an es gibt sehr viele Instanzen von Foo. Wenn mein Dtor nun so aussieht:</p>
<pre><code class="language-cpp">Foo::~Foo() {
   delete p;
   p=0;
   // Nicht-statische member löschen
}
</code></pre>
<p>dann wird viele tausende Male delete auf ein einen Null-Zeiger aufgerufen. Ist zwar in Ordnung, aber schöne wäre es doch, wenn das delete nur einmal aufgerufen werden würde. Dazu könnte ich eine statische lokale variable nehmen:</p>
<pre><code class="language-cpp">static bool called = false;
if(!called) {
   called = true;
   delete p;
}
</code></pre>
<p>Und alternativ könnte ich auch einen statischen &quot;Dtor&quot; anlegen: static void StaticDestructor(), der dann alle statischen Member löscht und den ich einfach manuell aufrufe.<br />
Wie löscht ihr also dynamisch allokierten Speicher, der von static Member referenziert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625570</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Thu, 04 Dec 2008 17:41:57 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Thu, 04 Dec 2008 18:21:37 GMT]]></title><description><![CDATA[<p>this-&gt;that schrieb:</p>
<blockquote>
<ol>
<li>Gibt es eine Möglichkeit const Variablen zu einem späteren Zeitpunkt zu initalisieren? Sagen wir ich habe einen DWORD pointer, den ich jedoch nicht bei der Definition sondern zu einem späteren Zeitpunkt A initialisieren will. Nach Zeitpunkt A soll er jedoch nie mehr geändert werden.</li>
</ol>
</blockquote>
<p>Wie wär's mit sowas hier?</p>
<pre><code class="language-cpp">const DWORD* foo;
// ...
DWORD *bar = new DWORD[10];
foo = bar;
bar[0] = 2;
</code></pre>
<p>this-&gt;that schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Foo::~Foo() {
   delete p;
   p=0;
   // Nicht-statische member löschen
}
</code></pre>
<p>dann wird viele tausende Male delete auf ein einen Null-Zeiger aufgerufen. Ist zwar in Ordnung, aber schöne wäre es doch, wenn das delete nur einmal aufgerufen werden würde.</p>
</blockquote>
<p>Wer allokiert p denn? Die Deallokation würde ich entsprechend dazu machen, also wenn z.B. das erste Foo-Objekt den Speicher bereitstellt, dann sollte auch erst das letzte Foo ihn wieder löschen. So wie das bei dir im Moment aussieht, mußt du nur einmal ein einziges Foo löschen, und schon hast du einen Haufen Foos, die plötzlich ohne p dastehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625590</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Thu, 04 Dec 2008 18:21:37 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Thu, 04 Dec 2008 18:34:58 GMT]]></title><description><![CDATA[<p>dooooomi schrieb:</p>
<blockquote>
<p>Wie wär's mit sowas hier?</p>
</blockquote>
<p>Hehe, kurz nach dem Posten ist mir auch diese Lösung eingefallen. So werde ichs auch machen.</p>
<p>dooooomi schrieb:</p>
<blockquote>
<p>Wer allokiert p denn? Die Deallokation würde ich entsprechend dazu machen, also wenn z.B. das erste Foo-Objekt den Speicher bereitstellt, dann sollte auch erst das letzte Foo ihn wieder löschen. So wie das bei dir im Moment aussieht, mußt du nur einmal ein einziges Foo löschen, und schon hast du einen Haufen Foos, die plötzlich ohne p dastehen...</p>
</blockquote>
<p>Ja, das stimmt. Wäre in meinem konkreten Fall jedoch kein Problem, da ich ALLE Foo Objekte auf einmal allokiere und alle auch wieder auf einen Schlag deallokiere. Ich machs jetzt einfach so, dass die Klasse die die Foo's und p allokiert das p einmalig wieder freigibt (eine allgemeinere Lösung wäre wohl über einen Referenzzähler).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625595</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Thu, 04 Dec 2008 18:34:58 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Thu, 04 Dec 2008 19:12:02 GMT]]></title><description><![CDATA[<p>Jetzt bin ich doch noch über ein kleines Problem gestoßen. Mein foo ist in Wirklichkeit ein Doppelzeiger:</p>
<pre><code class="language-cpp">const DWORD** foo;
</code></pre>
<p>und ich habe nun folgendes probiert:</p>
<pre><code class="language-cpp">const DWORD** foo;
DWORD** bar = new DWORD*[N];
// bar füllen
foo = bar;
</code></pre>
<p>Leider führt die letzte Zuweisung zu dem Fehler &quot;error C2440: '=' : cannot convert from 'DWORD **' to 'const DWORD **'<br />
Hat mich erstmal verwundert, denn schließlich geht das ja auch:</p>
<pre><code class="language-cpp">const DWORD* foo;
DWORD* bar = new ...
foo = bar
</code></pre>
<p>Sehe ich das richtig, dass die einzige Möglichkeit foo nun doch zu initialisieren so aussieht:</p>
<pre><code class="language-cpp">const DWORD** foo;
DWORD** bar = new DWORD*[N];
// bar füllen
for(...)
   foo[i] = bar[i];
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625622</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Thu, 04 Dec 2008 19:12:02 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Fri, 05 Dec 2008 01:26:31 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">const DWORD*const* foo;
</code></pre>
<p>siehe <a href="http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17" rel="nofollow">http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625731</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 05 Dec 2008 01:26:31 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Sat, 06 Dec 2008 03:06:02 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">const DWORD*const* foo;
</code></pre>
</blockquote>
<p>Hm, dann gibt es ja auch ein</p>
<pre><code class="language-cpp">const DWORD* const * const foo = 0;
</code></pre>
<p>C++ ist schon krank. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626036</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Sat, 06 Dec 2008 03:06:02 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Sat, 06 Dec 2008 08:21:01 GMT]]></title><description><![CDATA[<p>this-&gt;that schrieb:</p>
<blockquote>
<p>C++ ist schon krank. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Nun ja, ich weiß ja nicht wie jemand &quot;C++&quot; programmiert, aber Doppelzeiger etc. sind meines Erachtens in C++ eher die Ausnahme als die Regel (Bis auf an C-Kompatiblen DLL-Schnittstellen brauchte ich sowas jedenfalls nie).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626064</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sat, 06 Dec 2008 08:21:01 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Sat, 06 Dec 2008 11:34:17 GMT]]></title><description><![CDATA[<p>this-&gt;that schrieb:</p>
<blockquote>
<p>Hm, dann gibt es ja auch ein</p>
<pre><code class="language-cpp">const DWORD* const * const foo = 0;
</code></pre>
<p>C++ ist schon krank. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Du sagst es!<br />
Und dieser Thread zeigt wieder mal wunderbar, daß C++ Programmierer sehr viel Zeit investieren müßen, um die Mängel ihrer Programmiersprache zu umgehen. Wie soll man dabei produktiv sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626110</guid><dc:creator><![CDATA[c++ just sucks.doesnt it?]]></dc:creator><pubDate>Sat, 06 Dec 2008 11:34:17 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Sun, 07 Dec 2008 09:52:33 GMT]]></title><description><![CDATA[<p>c++ just sucks.doesnt it? schrieb:</p>
<blockquote>
<p>this-&gt;that schrieb:</p>
<blockquote>
<p>C++ ist schon krank. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Du sagst es!<br />
Und dieser Thread zeigt wieder mal wunderbar, daß C++ Programmierer sehr viel Zeit investieren müßen, um die Mängel ihrer Programmiersprache zu umgehen. Wie soll man dabei produktiv sein?</p>
</blockquote>
<p>Nur weil einer meint, kranke Konstrukte verwenden zu müssen, hat dies nichts mit dem Rest zu tun. In der freien Wildbahn trifft man sowas unter echten C++Programmierern wohl nicht an (Echt meine ich: keine C mit Klassen-Programmierer).</p>
<p>Man kann eine Sprache schlechter machen als sie ist, aber dann bitte mit praxisrelevanten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626390</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sun, 07 Dec 2008 09:52:33 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Sun, 07 Dec 2008 11:31:02 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Man kann eine Sprache schlechter machen als sie ist, aber dann bitte mit praxisrelevanten.</p>
</blockquote>
<p>Ist klar. Der OP ist natürlich ein Hobbyprogrammierer, der die äußersten Grenzen von C++ ausloten möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626436</guid><dc:creator><![CDATA[still sucking!]]></dc:creator><pubDate>Sun, 07 Dec 2008 11:31:02 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen von static membern und &amp;quot;verzögerte&amp;quot; Initialisierung von const membern on Sun, 07 Dec 2008 12:24:09 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Nur weil einer meint, kranke Konstrukte verwenden zu müssen, hat dies nichts mit dem Rest zu tun. In der freien Wildbahn trifft man sowas unter echten C++Programmierern wohl nicht an (Echt meine ich: keine C mit Klassen-Programmierer).</p>
</blockquote>
<p>Fast hätte ich eine ähnliche Antwort geschrieben. Dann dachte ich jedoch, dass es einen unregistrierten Troll mit dem Nick &quot;c++ just sucks.doesnt it?&quot; nicht wert wäre...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626455</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Dec 2008 12:24:09 GMT</pubDate></item></channel></rss>