<?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[Wie dynamischen Speicher einer statischen Variablen freigeben?]]></title><description><![CDATA[<p>Moin zusammen,</p>
<p>ich habe eine Funktion die etwa folgendermaßen aussieht:</p>
<pre><code class="language-cpp">std::set&lt;std::string&gt; const &amp; f()
{
    static std::set&lt;std::string&gt; *p = 0;

    if (p == 0)
    {
        p = new std::set&lt;std::string&gt;;
        *p.insert(...);
        .
        .
        .
    }

    return *p;
}
</code></pre>
<p>Wie kann ich nun den mit new allokierten Speicher wieder freigeben? Ein Ansatz wäre, eine Klasse um die Funktion herumzubauen, so das der Destruktor den Speicherplatz wieder freigeben kann.</p>
<pre><code class="language-cpp">class C
{
    private:
    static std::set&lt;std::string&gt; *p = 0;

    public:
    C()
    {
        if (p == 0)
        {
            p = new std::set&lt;std::string&gt;;
            *p.insert(...);
            .
            .
            .
        } 
    }

    ~C()
    {
        if (p != 0)
            delete p;
    }

    std::set&lt;std::string&gt; const &amp; f()
    {
        if (p == 0)
        {
            p = new std::set&lt;std::string&gt;;
            *p.insert(...);
            .
            .
            .
        }

        return *p;
    }
};
</code></pre>
<p>Was mir an der Lösung jedoch nicht gefällt ist, dass ich stets eine Instanz der Klasse brauche. Dabei würde es mir im Grunde reichen, wenn C::f statisch wäre. Wenn ich aber C::f nur statisch verwende, dann wird wieder kein Destruktor aufgerufen, der mir den Speicher freigeben würde.</p>
<p>Was ist also des Rätselts Lösung? Freue mich auf Antworten.</p>
<p>Gruß<br />
Paul</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287521/wie-dynamischen-speicher-einer-statischen-variablen-freigeben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 10:26:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287521.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 30 May 2011 09:57:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie dynamischen Speicher einer statischen Variablen freigeben? on Mon, 30 May 2011 09:57:04 GMT]]></title><description><![CDATA[<p>Moin zusammen,</p>
<p>ich habe eine Funktion die etwa folgendermaßen aussieht:</p>
<pre><code class="language-cpp">std::set&lt;std::string&gt; const &amp; f()
{
    static std::set&lt;std::string&gt; *p = 0;

    if (p == 0)
    {
        p = new std::set&lt;std::string&gt;;
        *p.insert(...);
        .
        .
        .
    }

    return *p;
}
</code></pre>
<p>Wie kann ich nun den mit new allokierten Speicher wieder freigeben? Ein Ansatz wäre, eine Klasse um die Funktion herumzubauen, so das der Destruktor den Speicherplatz wieder freigeben kann.</p>
<pre><code class="language-cpp">class C
{
    private:
    static std::set&lt;std::string&gt; *p = 0;

    public:
    C()
    {
        if (p == 0)
        {
            p = new std::set&lt;std::string&gt;;
            *p.insert(...);
            .
            .
            .
        } 
    }

    ~C()
    {
        if (p != 0)
            delete p;
    }

    std::set&lt;std::string&gt; const &amp; f()
    {
        if (p == 0)
        {
            p = new std::set&lt;std::string&gt;;
            *p.insert(...);
            .
            .
            .
        }

        return *p;
    }
};
</code></pre>
<p>Was mir an der Lösung jedoch nicht gefällt ist, dass ich stets eine Instanz der Klasse brauche. Dabei würde es mir im Grunde reichen, wenn C::f statisch wäre. Wenn ich aber C::f nur statisch verwende, dann wird wieder kein Destruktor aufgerufen, der mir den Speicher freigeben würde.</p>
<p>Was ist also des Rätselts Lösung? Freue mich auf Antworten.</p>
<p>Gruß<br />
Paul</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070878</guid><dc:creator><![CDATA[_paul_]]></dc:creator><pubDate>Mon, 30 May 2011 09:57:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie dynamischen Speicher einer statischen Variablen freigeben? on Mon, 30 May 2011 10:01:47 GMT]]></title><description><![CDATA[<p>Warum benutzt du überhaupt new? Machs doch so:</p>
<pre><code class="language-cpp">std::set&lt;std::string&gt; initFunction()
{
    std::set&lt;std::string&gt; p;    // Ist wegen NRVO nicht teuer
    p.insert(...);
    ...
    return p;
}

const std::set&lt;std::string&gt;&amp; f()
{
    static std::set&lt;std::string&gt; p = initFunction();
    return p;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2070880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070880</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 30 May 2011 10:01:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wie dynamischen Speicher einer statischen Variablen freigeben? on Mon, 30 May 2011 10:03:42 GMT]]></title><description><![CDATA[<p>Das war jetzt zu einfach. <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>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070883</guid><dc:creator><![CDATA[_paul_]]></dc:creator><pubDate>Mon, 30 May 2011 10:03:42 GMT</pubDate></item></channel></rss>