<?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[Speicherzustand eines Objekts]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gerne für verschiedene Instanzen einer klasse speichern ob diese mit new oder lokal erzeugt worden sind.<br />
Hierfür hätte ich in der Klasse new und delete überladen.<br />
Bei New müßte ich dann in eine Statische Variable einen Wert setzen, welcher dann<br />
vom Konstuktor in die Instanz geschrieben wird.<br />
Ist das okay oder ist new und dann konstuktor aufruf nicht atomar ??</p>
<pre><code class="language-cpp">class foo
{
....
public:
static void * operator new(std::size_t size)
        {
            staticIsAllocated=true;
            return std::malloc(size);
        }
foo():IsAllocated(staticIsAllocated)
{
staticIsAllocated=false;
mall....
}

private:
static bool staticIsAllocated;
bool IsAllocated
}
</code></pre>
<p>Kann mit der übergabe des Wahrheitswertes was schief gehen ??</p>
<p>Grüße Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284578/speicherzustand-eines-objekts</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 22:22:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284578.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 Apr 2011 11:19:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherzustand eines Objekts on Mon, 04 Apr 2011 11:21:07 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gerne für verschiedene Instanzen einer klasse speichern ob diese mit new oder lokal erzeugt worden sind.<br />
Hierfür hätte ich in der Klasse new und delete überladen.<br />
Bei New müßte ich dann in eine Statische Variable einen Wert setzen, welcher dann<br />
vom Konstuktor in die Instanz geschrieben wird.<br />
Ist das okay oder ist new und dann konstuktor aufruf nicht atomar ??</p>
<pre><code class="language-cpp">class foo
{
....
public:
static void * operator new(std::size_t size)
        {
            staticIsAllocated=true;
            return std::malloc(size);
        }
foo():IsAllocated(staticIsAllocated)
{
staticIsAllocated=false;
mall....
}

private:
static bool staticIsAllocated;
bool IsAllocated
}
</code></pre>
<p>Kann mit der übergabe des Wahrheitswertes was schief gehen ??</p>
<p>Grüße Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044495</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Mon, 04 Apr 2011 11:21:07 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzustand eines Objekts on Mon, 04 Apr 2011 13:23:04 GMT]]></title><description><![CDATA[<p>Was hast du vor? Spielerei oder ernsthafte Anwendung?</p>
<p>Ich verweise mal auf diesen Thread:<br />
<a href="http://www.c-plusplus.net/forum/206880-20" rel="nofollow">http://www.c-plusplus.net/forum/206880-20</a><br />
Insbesondere die Beiträge von Shade of Mine auf der dritten Seite.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044532</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 04 Apr 2011 13:23:04 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzustand eines Objekts on Mon, 04 Apr 2011 13:35:54 GMT]]></title><description><![CDATA[<p>Es gibt Punkte,<br />
Es gibt Kanten, bestehend aus zwei zeigern (Start-End Punkt).<br />
Jeder Punkt hat einen Zeiger auf all seine Kanten.</p>
<p>Wenn ich nun einen Punkt lösche, so möchte ich automatisch auch die Kanten dazu löschen.<br />
Je nach dem ob die Kanten mit new oder nicht erzeugt worden ist, sollte ich die Kanten zerstören.</p>
<p>Wobei so oder so um die Klasse noch was drum rum kommt, so das ich vorraussichtlich lediglich die new variante benutzen werde.<br />
Trotzdem würde ich die Frage interessieren ob das hin haut.<br />
Treadsafe ist es nicht denke ich....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044540</guid><dc:creator><![CDATA[AlexanderKiebler]]></dc:creator><pubDate>Mon, 04 Apr 2011 13:35:54 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzustand eines Objekts on Mon, 04 Apr 2011 13:43:33 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>ich würde gerne für verschiedene Instanzen einer klasse speichern ob diese mit new oder lokal erzeugt worden sind.</p>
</blockquote>
<p>Tu das bitte bitte bitte nicht. Du löst damit keine Probleme, aber schaffst dir ein Dutzend neue.</p>
<p>Nexus (von &lt;a href= schrieb:</p>
<blockquote>
<p>hier)&quot;&gt;Nochmals die wichtigsten Gründe, warum es nicht sinnvoll ist, wenn eine Klasse sich unterschiedlich verhält, wenn ihre Objekte automatisch oder dynamisch angefordert wurden. Ganz unabhängig davon, ob die Unterscheidung überhaupt realisierbar ist.</p>
<ul>
<li>Du versuchst mit dem Ansatz, benutzerfreundlich zu sein, und den Speicher automatisch freizugeben, wenn er vom Benutzer dynamisch angefordert wurde. Die Idee ist prinzipiell sehr gut, aber das mit der Benutzerfreundlichkeit geht komplett nach hinten los.</li>
<li>Der Grund ist, dass du Konzepte aus anderen Sprachen (Garbage Collector) 1:1 nach C++ übertragen willst, wo Speicherverwaltung aber ganz anders abläuft. C++ hat viel strengere und eindeutigere Besitzverhältnisse als Sprachen mit GC (Speicher ist nicht geteilt, sondern hat meist einen klaren Besitzer). Normalerweise wird der Speicher von dem freigegeben, der ihn anfordert. Mit deinem Versuch verstösst du gegen diese Konvention.</li>
<li>Dadurch rufst du beim Benutzer Verwirrung hervor. Wenn der Benutzer ein einfaches <code>new</code> verwendet, geht er davon aus, den Speicher ohne Probleme mit <code>delete</code> freigeben zu können. Er wird sich wundern, wenn ganz normaler Code einfach abstürzt.</li>
<li>Gleichzeitig nimmst du dem Anwender mit dem GC die Freiheit, sich Speicher irgendwie zu verschaffen. Er kann den Stack benutzen, den Heap ( <code>malloc()</code> aus C), den Freestore ( <code>new</code> ) oder irgendeinen anderen Allokator. Mit einem automatischen <code>delete</code> in deiner Bibliothek zwingst du ihn zur Verwendung des <code>new</code> -Operators.</li>
<li>In C++ benutzt man das RAII-Idiom, um manuelle Speicherverwaltung zu vermeiden. Damit muss gar niemand mehr explizit den Speicher freigeben, sondern die Aufgabe wird an eine Klasse (z.B. Smart-Pointer) delegiert. Damit ist der Grund dafür, überhaupt einen automatischen Freigabemechanismus in deiner Bibliothek einzurichten, hinfällig.</li>
</ul>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2044544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044544</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 04 Apr 2011 13:43:33 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzustand eines Objekts on Mon, 04 Apr 2011 13:45:57 GMT]]></title><description><![CDATA[<p>AlexanderKiebler schrieb:</p>
<blockquote>
<p>Wenn ich nun einen Punkt lösche, so möchte ich automatisch auch die Kanten dazu löschen.<br />
Je nach dem ob die Kanten mit new oder nicht erzeugt worden ist, sollte ich die Kanten zerstören.</p>
</blockquote>
<p>Erzeuge die Kanten immer mit <code>new</code> und die Frage stellt sich gar nicht erst. Als netten Nebeneffekt bist du dabei das Problem los, dass lokale Objekte automatisch am Ende des Scopes zerstört werden und deine Zeiger ungültig machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044545</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 04 Apr 2011 13:45:57 GMT</pubDate></item></channel></rss>