<?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 erzeugen auf dem Stack oder auf dem Heap ?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also vorab, ich hab die FAQs gelesen und auch die Suche benutzt, habe aber trotzdem noch ein paar Fragen wo ich noch Probleme mit habe:</p>
<p>1. Gibt es eine Faustformel, wann Stack und wann Heap ? Also, z.B. bei X RAM Arbeitsspeicher sollte der Stack für Objekte nur bis 1/3 X RAM verwendet werden, wenn größer der Heap.</p>
<p>2. Wie kann ich bei großen Objekten einfach feststellen/prüfen wieviel Speicherplatz sie beim Erzeugen verwenden ?</p>
<p>3. Wenn ich prüfen will ob ein Objekt X schon erzeugt wurde (um es nicht ein 2. mal zu definieren), muss es ja vorher deklariert werden. Ist das richtig wenn ich das wie folgt mache:</p>
<pre><code class="language-cpp">// Die Deklaration von X -&gt; hat noch keinen Speicherverbrauch
CKlasse *X = NULL;
// ...
// Hier wird X erzeugt, fall X noch nicht existiert
if ( X == NULL ) X = new CKlasse();
// ...
// und hier wieder gelöscht
delete X;
X = NULL;
</code></pre>
<p>Vielen Dank für Eure Hilfe.</p>
<p>WoWe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/157936/objekte-erzeugen-auf-dem-stack-oder-auf-dem-heap</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 06:33:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/157936.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Aug 2006 19:40:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Wed, 30 Aug 2006 19:40:53 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also vorab, ich hab die FAQs gelesen und auch die Suche benutzt, habe aber trotzdem noch ein paar Fragen wo ich noch Probleme mit habe:</p>
<p>1. Gibt es eine Faustformel, wann Stack und wann Heap ? Also, z.B. bei X RAM Arbeitsspeicher sollte der Stack für Objekte nur bis 1/3 X RAM verwendet werden, wenn größer der Heap.</p>
<p>2. Wie kann ich bei großen Objekten einfach feststellen/prüfen wieviel Speicherplatz sie beim Erzeugen verwenden ?</p>
<p>3. Wenn ich prüfen will ob ein Objekt X schon erzeugt wurde (um es nicht ein 2. mal zu definieren), muss es ja vorher deklariert werden. Ist das richtig wenn ich das wie folgt mache:</p>
<pre><code class="language-cpp">// Die Deklaration von X -&gt; hat noch keinen Speicherverbrauch
CKlasse *X = NULL;
// ...
// Hier wird X erzeugt, fall X noch nicht existiert
if ( X == NULL ) X = new CKlasse();
// ...
// und hier wieder gelöscht
delete X;
X = NULL;
</code></pre>
<p>Vielen Dank für Eure Hilfe.</p>
<p>WoWe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1127929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127929</guid><dc:creator><![CDATA[WoWe]]></dc:creator><pubDate>Wed, 30 Aug 2006 19:40:53 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Wed, 30 Aug 2006 20:50:14 GMT]]></title><description><![CDATA[<p>WoWe schrieb:</p>
<blockquote>
<p>2. Wie kann ich bei großen Objekten einfach feststellen/prüfen wieviel Speicherplatz sie beim Erzeugen verwenden ?</p>
</blockquote>
<pre><code class="language-cpp">sizeof( Objekt )
</code></pre>
<p>WoWe schrieb:</p>
<blockquote>
<p>...(um es nicht ein 2. mal zu definieren)...</p>
</blockquote>
<p>Ansich wär dafür ein Singleton recht nett <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/1127979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127979</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Wed, 30 Aug 2006 20:50:14 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Wed, 30 Aug 2006 21:29:24 GMT]]></title><description><![CDATA[<p>Also mit sizeof( X ) bekomme ich &quot;4&quot; zurück geliefert, habe aber min. 8 int in dem Objekt.</p>
<p>Kannst du das mit dem Singleton etwas näher erläutern ?</p>
<p>Danke und Gruß</p>
<p>WoWe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1127992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127992</guid><dc:creator><![CDATA[WoWe]]></dc:creator><pubDate>Wed, 30 Aug 2006 21:29:24 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Wed, 30 Aug 2006 21:38:42 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">sizeof( *Zeiger )
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1127998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127998</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 30 Aug 2006 21:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Wed, 30 Aug 2006 21:46:54 GMT]]></title><description><![CDATA[<p>Danke,</p>
<p>damit sieht der Wert realistisch aus.</p>
<p>Kannst du auch was zu Singleton und meinem Beispiel sagen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128005</guid><dc:creator><![CDATA[WoWe]]></dc:creator><pubDate>Wed, 30 Aug 2006 21:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Wed, 30 Aug 2006 21:53:27 GMT]]></title><description><![CDATA[<p>WoWe schrieb:</p>
<blockquote>
<p>Kannst du auch was zu Singleton und meinem Beispiel sagen ?</p>
</blockquote>
<pre><code class="language-cpp">CKlasse&amp; getTheOneAndOnlyCKlasse(){
   static CKlasse x;
   return x;
}
//und wer es braucht, macht
getTheOneAndOnlyCKlasse().methode();
</code></pre>
<p>das objekt wird erst angelegt, wenn es zum ersten mal gebaraucht wird und wird automagisch nach der main() gelöscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128008</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 30 Aug 2006 21:53:27 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Wed, 30 Aug 2006 22:04:44 GMT]]></title><description><![CDATA[<p>Hallo Volkard,</p>
<p>danke für deine Hilfe. Das bringt mich zwar i.M. noch nicht weiter, aber ich hab zumindst was zum Googlen <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/1128019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128019</guid><dc:creator><![CDATA[WoWe]]></dc:creator><pubDate>Wed, 30 Aug 2006 22:04:44 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Wed, 30 Aug 2006 22:09:57 GMT]]></title><description><![CDATA[<p>WoWe schrieb:</p>
<blockquote>
<p>Hallo Volkard,</p>
<p>danke für deine Hilfe. Das bringt mich zwar i.M. noch nicht weiter, aber ich hab zumindst was zum Googlen <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>
</blockquote>
<p>dann google gleich nach meyers-singleton<br />
der meyers-singleton ist der gebräuchlichste, aber es gibt noch nen haufen mehr. wenn du den kennst und der nicht so passt, sag genau, was du brauchst, dann frickeln wir einen zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128025</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 30 Aug 2006 22:09:57 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Thu, 31 Aug 2006 00:13:13 GMT]]></title><description><![CDATA[<p>Hallo volkard,</p>
<p>Was gibt es denn noch für Singletons?</p>
<p>Ist Meyers-Singleton threadsicher oder kann da theoretisch<br />
(natürlich nur beim 1. Aufruf) Konflikte entstehen?</p>
<p>Gruß,<br />
Dennis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128045</guid><dc:creator><![CDATA[Singleton]]></dc:creator><pubDate>Thu, 31 Aug 2006 00:13:13 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Thu, 31 Aug 2006 00:21:09 GMT]]></title><description><![CDATA[<p>Singleton schrieb:</p>
<blockquote>
<p>Hallo volkard,<br />
Was gibt es denn noch für Singletons?</p>
</blockquote>
<p>nen ganzen haufen hat alexandrescu in modern c++ design gezeigt.</p>
<blockquote>
<p>Ist Meyers-Singleton threadsicher oder kann da theoretisch<br />
(natürlich nur beim 1. Aufruf) Konflikte entstehen?</p>
</blockquote>
<p>da kann ein konflikt entstehen.<br />
natürlich kann man den wiederum mit men mutex abfangen. und den mutex verbilligt man mit nem atomaren nachguck auf nen int um den mutex. oder man tutu threadlokal die referenz auf das objekt cachen. oder, was mein liebling ist, man erzwingt die erzeugung einfach vorher mit</p>
<pre><code class="language-cpp">namepace{
CKlasse&amp; theOneAndOnlyCKlasse=getTheOneAndOnlyCKlasse();
}
</code></pre>
<p>innerhalb der Klasse.h</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128047</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 31 Aug 2006 00:21:09 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Thu, 31 Aug 2006 05:56:18 GMT]]></title><description><![CDATA[<p>Oder man macht kein meyers-singleton, sondern so:</p>
<pre><code class="language-cpp">class CKlasse
{
  private:
    CKlasse() { }
    ~CKlasse() { }
    CKlasse&amp; operator= (const CKlasse&amp;) { }
  public:
    static CKlasse&amp; getInstance();
};

CKlasse&amp; getInstance()
{
  static CKlasse* instance = 0;
  static Mutex mutex;
  if (instance == 0)  // erst ohne lock prüfen
  {
    Lock lock(mutex);
    if (instance == 0)  // jetzt mit lock prüfen, ob sich inzwischen was geändert hat
    {
      // hier sind wir jetzt exklusiv
      instance = new CKlasse();
    }
  }
  return *instance;
}
</code></pre>
<p>Das minimiert die Locks und man hat selbst Kontrolle über die Instantiierung. Ist bei Alexandrescu beschrieben.</p>
<p>Die ganze Sache mit dem privaten Konstruktor, Destruktor und Zweisungsoperator hat den Sinn, daß der Compiler schon meckert, wenn man versucht, eine Instanz selbst anzulegen. Das kann schon mal versehentlich passieren, wie z. B.:</p>
<pre><code class="language-cpp">CKlasse instanz = CKlasse::getInstance(); // geht nicht, da Zuweisung privat ist
</code></pre>
<p>so geht es aber:</p>
<pre><code class="language-cpp">CKlasse&amp; instanz = CKlasse::getInstance();
</code></pre>
<p>Ein Nachteil hat das ganze: Die Klasse wird nie zerstört. Aber das will man ja eigentlich auch gar nicht. Das fällt aber auf, wenn man einen Memory-leak-debugger nutzt. Der bemängelt, daß die Instanz nach Programmende nicht freigegeben wurde.</p>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128066</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Thu, 31 Aug 2006 05:56:18 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte erzeugen auf dem Stack oder auf dem Heap ? on Thu, 31 Aug 2006 06:49:45 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Oder man macht kein meyers-singleton, sondern so:</p>
<p>Das minimiert die Locks und man hat selbst Kontrolle über die Instantiierung. Ist bei Alexandrescu beschrieben.</p>
<p>Die ganze Sache mit dem privaten Konstruktor, Destruktor und Zweisungsoperator hat den Sinn, daß der Compiler schon meckert, wenn man versucht, eine Instanz selbst anzulegen. Das kann schon mal versehentlich passieren, wie z. B.:</p>
<pre><code class="language-cpp">CKlasse instanz = CKlasse::getInstance(); // geht nicht, da Zuweisung privat ist
</code></pre>
<p>so geht es aber:</p>
<pre><code class="language-cpp">CKlasse&amp; instanz = CKlasse::getInstance();
</code></pre>
<p>Ein Nachteil hat das ganze: Die Klasse wird nie zerstört. Aber das will man ja eigentlich auch gar nicht. Das fällt aber auf, wenn man einen Memory-leak-debugger nutzt. Der bemängelt, daß die Instanz nach Programmende nicht freigegeben wurde.</p>
<p>Tntnet</p>
</blockquote>
<p>leider ist auch das nicht thread-safe. der zeiger instance sollte auf jeden fall extern linkage haben. nur dann kann man argumentieren, dass das erstellen eines Lock objekts potentiell auswirkungen auf seinen zustand hat (und so den compiler daran hindern, den code so zu transformieren, dass etwa das zweite if vor dem lock steht). das andere - wesentlichere - problem ist die sichtbarkeit von veränderungen an instance. ohne ein geeignetes speichermodell, das C++ gegnwärtig nicht hat, ist dieses problem prinzipiell nicht allgemein lösbar. die tatsache, das so etwas auf single-prozessor-systemen oder typischen multicore-pc-systmen funktioniert, bedeutet nicht, das diese konstruktion an sich sicher ist.</p>
<p>Edit: es müßte genügen, instance volatile zu machen, anstatt ihm extern linkage zu geben. zwar ist der einzige weg, auf instance zuzugreifen, der aufruf von getInstance(), aber genau das könnte der Lock-Konstruktor ja tun. und da zugriffe auf volatile variablen und die reihenfolge dieser zugriffe beobachtbar sind; genügt das, um die beschriebene umordnung zu verhindern (vorausgesetzt, der compiler bekommt bestimmte teile des codes von Lock nie zu sehen). Ein anderes problem ist Mutex. Da es sich vermutlich nicht um ein POD handelt, wird der compiler die initialisierung erst beim ersten aufruf initialisieren. aber wann ist denn der erste aufruf, wenn die funktion aus mehreren threads aufgerufen wird ? <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/1128085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128085</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 31 Aug 2006 06:49:45 GMT</pubDate></item></channel></rss>