<?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[probs bei delete auf static pointer (Factory, Singleton,..)]]></title><description><![CDATA[<p>Habe sowas: (vereinfacht)</p>
<pre><code class="language-cpp">//.h

class AClass
{
    public:
        static *AClass Instance();
        static DeleteInstance();
        void Foo();
    protected:
        AClass() : bar(true) { };
        virtual ~AClass();
    private:
        static AClass *mpInstance;
        bool bar;
};

//.cpp

AClass *AClass::mpInstance = NULL;

AClass *AClass::Instance()
{
    if( !mpInstance )
    {
        mpInstance = new AClass();
    }
    return mpInstance;
}

void AClass::DeleteInstance()
{
    delete mpInstance;
    mpInstance = NULL;
}

AClass::~AClass()
{
    Foo();
    //beim verlassen vom destructor crasht es
}

void AClass::Foo()
{
    bar = false;
}
</code></pre>
<p>ist doch so ok, oder nicht... aber es kracht genau am ende des destructors...<br />
die zuweisung NULL an mpInstance führt er nicht mehr aus...</p>
<p>Wenn ich DeleteInstance() nicht aufrufe, sondern es beim beenden des progs automatisch zerstören lasse, kracht es nicht.... merkwürdig, oder?<br />
kann mir wer sagen, woran es liegen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/120080/probs-bei-delete-auf-static-pointer-factory-singleton</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 05:45:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/120080.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Sep 2005 16:20:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Thu, 08 Sep 2005 16:20:50 GMT]]></title><description><![CDATA[<p>Habe sowas: (vereinfacht)</p>
<pre><code class="language-cpp">//.h

class AClass
{
    public:
        static *AClass Instance();
        static DeleteInstance();
        void Foo();
    protected:
        AClass() : bar(true) { };
        virtual ~AClass();
    private:
        static AClass *mpInstance;
        bool bar;
};

//.cpp

AClass *AClass::mpInstance = NULL;

AClass *AClass::Instance()
{
    if( !mpInstance )
    {
        mpInstance = new AClass();
    }
    return mpInstance;
}

void AClass::DeleteInstance()
{
    delete mpInstance;
    mpInstance = NULL;
}

AClass::~AClass()
{
    Foo();
    //beim verlassen vom destructor crasht es
}

void AClass::Foo()
{
    bar = false;
}
</code></pre>
<p>ist doch so ok, oder nicht... aber es kracht genau am ende des destructors...<br />
die zuweisung NULL an mpInstance führt er nicht mehr aus...</p>
<p>Wenn ich DeleteInstance() nicht aufrufe, sondern es beim beenden des progs automatisch zerstören lasse, kracht es nicht.... merkwürdig, oder?<br />
kann mir wer sagen, woran es liegen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/868047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/868047</guid><dc:creator><![CDATA[Ridley]]></dc:creator><pubDate>Thu, 08 Sep 2005 16:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Thu, 08 Sep 2005 17:13:26 GMT]]></title><description><![CDATA[<p>Dein Code gibt nach Beseitigung der beiden (Tipp-)Fehler bei mir keinen Absturz. Ist Dir genau der Code abgestürzt, oder glaubst Du nur, dass es an dem Code liegt?</p>
<pre><code class="language-cpp">class AClass
{
    public:
        static AClass* Instance(); // *AClass
        static void DeleteInstance();  // void vergessen
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/868075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/868075</guid><dc:creator><![CDATA[niemand]]></dc:creator><pubDate>Thu, 08 Sep 2005 17:13:26 GMT</pubDate></item><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Thu, 08 Sep 2005 17:16:25 GMT]]></title><description><![CDATA[<p>Ridley schrieb:</p>
<blockquote>
<p>Wenn ich DeleteInstance() nicht aufrufe</p>
</blockquote>
<p>Wo wird DeleteInstance denn aufgerufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/868077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/868077</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Thu, 08 Sep 2005 17:16:25 GMT</pubDate></item><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Fri, 09 Sep 2005 05:35:16 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9698">@niemand</a>:</p>
<p>habe die klasse hier nur zur vereinfachung erstellt... habe gar nicht getestet, ob es in der form auch abstuerzt.<br />
danke, dass du fuer mich das testen uebernommen hast.</p>
<p>daraus schliesse ich, dass in der &quot;echten&quot; Klasse irgendwelche member sind, die beim zerstoeren probleme machen. entweder die reihenfolge ist falsch, oder es gibt ausserhalb der klasse noch abhaengigkeiten...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/2813">@groovemaster</a>:</p>
<p>kurz vor programmende rufe ich DeleteInstance auf. Fuer das Projekt, in dem ich die Klasse einsetze, wird man das DeleteInstance nicht brauchen, da man immer mit der einmal erstellten Instanz auskommen wird. Von daher gebe ich mich erstmal damit zufrieden, dass es beim automatischen Zerstoeren beim Programm-ende keine Probleme macht.<br />
Allerdings ist es sauberer, wenn man die Instanz noch vor Ende selbst zerstoert...</p>
<p>Ich werde mal schauen, ob ich irgendwelche abhaengigkeiten entdecke. Wird nur ertwas schwer, da ich in der Klasse und auch im restlichen Projekt mehrere Klassen aus einer Library benutze und nicht 100%ig weiss, was dort intern ablaeuft bzw. nicht die Library Klassen debuggen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/868359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/868359</guid><dc:creator><![CDATA[Ridley]]></dc:creator><pubDate>Fri, 09 Sep 2005 05:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Fri, 09 Sep 2005 07:27:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Vielleicht hilft dir ja dieser Text<br />
<a href="http://www.oop-trainer.de/Themen/Singleton.html" rel="nofollow">http://www.oop-trainer.de/Themen/Singleton.html</a><br />
Hier wird unter anderen ein Weg gezeigt, wie man ohne DeleteInstance auskommt.</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/868396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/868396</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 09 Sep 2005 07:27:42 GMT</pubDate></item><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Fri, 09 Sep 2005 12:51:26 GMT]]></title><description><![CDATA[<p>Ridley schrieb:</p>
<blockquote>
<p>Von daher gebe ich mich erstmal damit zufrieden, dass es beim automatischen Zerstoeren beim Programm-ende</p>
</blockquote>
<p>Der Standard garantiert sowas allerdings nicht. Dem BS zu vertrauen mag zwar helfen, ist aber keine definitive Lösung. Ich würde auf jeden Fall versuchen, den Fehler zu finden. Vielleicht gibts ja noch ganz andere Schwachstellen in diesem Zusammenhang.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/868629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/868629</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 09 Sep 2005 12:51:26 GMT</pubDate></item><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Fri, 09 Sep 2005 13:31:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1387">@braunstein</a>:</p>
<p>danke fuer den interessanten link!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/2813">@groovemaster</a>:</p>
<p>ja, ich werde da nach suchen, einige moeglichkeiten wuesste ich, sind aber nicht viele.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/868665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/868665</guid><dc:creator><![CDATA[Ridley]]></dc:creator><pubDate>Fri, 09 Sep 2005 13:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Fri, 09 Sep 2005 14:39:16 GMT]]></title><description><![CDATA[<p>groovemaster  schrieb:</p>
<blockquote>
<p>Der Standard garantiert sowas allerdings nicht. Dem BS zu vertrauen mag zwar helfen, ist aber keine definitive Lösung. Ich würde auf jeden Fall versuchen, den Fehler zu finden. Vielleicht gibts ja noch ganz andere Schwachstellen in diesem Zusammenhang.</p>
</blockquote>
<p>Den Fehler sollte Ridley auf jeden Fall suchen. Allerdings habe ich den Standard so verstanden, dass es garantiert ist, das der Destructor aufgerufen wird. Das hat auch nichts mit dem BS zu tun; das gibt allerhöchstens den nicht freigegebenen Speicher und ähnliche Resourcen wieder frei.</p>
<p>C++ Standard 3.6.3.1 schrieb:</p>
<blockquote>
<p>Destructors (12.4) for initialized objects of static storage duration (declared at block scope or at namespace<br />
scope) are called as a result of returning from main and as a result of calling exit (18.3). These objects<br />
are destroyed in the reverse order of the completion of their constructor or of the completion of their<br />
dynamic initialization. If an object is initialized statically, the object is destroyed in the same order as if the<br />
object was dynamically initialized. For an object of array or class type, all subobjects of that object are<br />
destroyed before any local object with static storage duration initialized during the construction of the subobjects<br />
is destroyed.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/868734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/868734</guid><dc:creator><![CDATA[niemand]]></dc:creator><pubDate>Fri, 09 Sep 2005 14:39:16 GMT</pubDate></item><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Fri, 09 Sep 2005 16:27:39 GMT]]></title><description><![CDATA[<p>niemand schrieb:</p>
<blockquote>
<p>Allerdings habe ich den Standard so verstanden, dass es garantiert ist, das der Destructor aufgerufen wird.</p>
</blockquote>
<p>Das ist zwar richtig, hat aber nichts mit dem Thema zu tun. Ridley gibt ja die Ressourcen nicht im dtor frei, sondern macht das explizit über die DeleteInstance Funktion. Und aus C++ Sicht lebt ein mit new erzeugtes Objekt solange, bis es mit delete zerstört wird.<br />
Und dass man den Vorteil von einem dtor mit globalen Instanzen verbinden kann, hat Braunstein ja schon angesprochen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/868789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/868789</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 09 Sep 2005 16:27:39 GMT</pubDate></item><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Fri, 09 Sep 2005 17:24:39 GMT]]></title><description><![CDATA[<p>Sorry, hast Recht; habe übersehen, dass der Singleton über einen Pointer realisiert ist (mache ich gewöhnlich nicht so).<br />
Damit wird der Destruktor aber eben genau unter keinen Umständen aufgerufen. Es werden lediglich vom BS ggf. die belegten Ressourcen freigegeben. Wenn der Destructor aber irgendeine Logik enthält (z.B. in ein Protokoll schreiben), passiert das garantiert nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/868819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/868819</guid><dc:creator><![CDATA[niemand]]></dc:creator><pubDate>Fri, 09 Sep 2005 17:24:39 GMT</pubDate></item><item><title><![CDATA[Reply to probs bei delete auf static pointer (Factory, Singleton,..) on Sat, 10 Sep 2005 18:12:35 GMT]]></title><description><![CDATA[<p>Hm, war ein verzwicktes Problem, bzw. ist es immer noch. Eine FremdKlasse aus einer Library ( ClanLib, falls wer kennt...) macht beim zerstören immer Probleme, eagl wo. Es sei denn man lässt sie automatisch wegräumen.</p>
<p>Meine Instanz der Klasse wird jetzt fehlerfrei beseitigt. Um den Crash zu vermeiden, bleibt aber das Object aus der ClanLib-Library noch im Speicher und wird bei Programmende zerstört (ohne Probleme).</p>
<p>danke für die erklärungen und tipps!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/869337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/869337</guid><dc:creator><![CDATA[Ridley]]></dc:creator><pubDate>Sat, 10 Sep 2005 18:12:35 GMT</pubDate></item></channel></rss>