<?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[Fragen zu Heap und Stack]]></title><description><![CDATA[<p>Nun, ich erstelle eigenhändig zu Hause eine Klasse, die der Laufzeitbibliothekenklasse &lt;string&gt; ähnelt. Mit ihr soll man leichter mit Strings arbeiten können, da &lt;string&gt; meiner Meinung nach relativ schwierig zu handhaben ist. Hier mal ein paar kleinere Ausschnitte:</p>
<pre><code>(...)
#include &lt;iostream&gt;
using namespace std;
(...)
typedef unsigned __int8	BYTE //zur Kompatibilität mit anderen Copilern
typedef unsigned __int32	DWORD
(...)
class CExceptionMemory
{
    void low_memory()
    {
        cerr&lt;&lt;&quot;Es steht nicht genug Speicher zur Verfügung. Programm wird beendet...\n&quot;;
        cin.get();
        exit(1);
    }
	(...)
};
(...)
class CString_D
{
public:
    CString_D(BYTE *pszInput)	{(...)} //Diese Konstruktoren arbeiten
    CString_D(BYTE cInput)   	{(...)} //mit C-Strings auf dem Stack,
    CString_D(char *pszInput)	{(...)} //da intern keine delete-Operation
    CString_D(char cInput)		{(...)} //vorgenommen wird.
    ~CString_D()			{(...)} //Destruktor
    (...)
    //Hier kommt das Problem:
    CString_D operator-(DWORD number)
    {
        //Erstellt einen Pufferstring
        BYTE *pTemp; //Zeiger auf Speicher im Heap
        try
        {
            if((pTemp=new BYTE[m_dwLenght-number])==NULL)
            throw CExceptionMemory();
        }
        catch(CExceptionMemory &amp;exception)
        {
        exception.low_memory();
        }
        (...)   
        //Nach der Bearbeitung soll der String zur Konstruktion 
        //eines CString_D-Objekts benutzt werden
        return CString_D(pTemp) //Hier ist der Fehler
        }
};
(...)
</code></pre>
<p>In diesem Beispiel wird in dem überladenem Operator - ein Zeiger auf Speicher im Heap eingerichtet. Doch der Speicher wird im Konstruktor nie freigegeben. Wenn ich allerdings eine delete-Operation in die Konstruktoren einbaue, haut mir mein Betriebssystem eine Fehlermeldung aus, sobald ich versuche, einen String als Argument auf dem Stack zu übergeben, da dieser Speicher nicht freigegeben werden kann. Deshalb: gibt es eine Möglichkeit, herauszufinden, ob ein Zeiger auf Speicher im Stack oder im Heap verweisst, am besten in einem if-Vergleich, und dann die jeweilige Aktion ausführen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/235768/fragen-zu-heap-und-stack</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 04:07:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/235768.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Mar 2009 09:40:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen zu Heap und Stack on Fri, 06 Mar 2009 09:40:23 GMT]]></title><description><![CDATA[<p>Nun, ich erstelle eigenhändig zu Hause eine Klasse, die der Laufzeitbibliothekenklasse &lt;string&gt; ähnelt. Mit ihr soll man leichter mit Strings arbeiten können, da &lt;string&gt; meiner Meinung nach relativ schwierig zu handhaben ist. Hier mal ein paar kleinere Ausschnitte:</p>
<pre><code>(...)
#include &lt;iostream&gt;
using namespace std;
(...)
typedef unsigned __int8	BYTE //zur Kompatibilität mit anderen Copilern
typedef unsigned __int32	DWORD
(...)
class CExceptionMemory
{
    void low_memory()
    {
        cerr&lt;&lt;&quot;Es steht nicht genug Speicher zur Verfügung. Programm wird beendet...\n&quot;;
        cin.get();
        exit(1);
    }
	(...)
};
(...)
class CString_D
{
public:
    CString_D(BYTE *pszInput)	{(...)} //Diese Konstruktoren arbeiten
    CString_D(BYTE cInput)   	{(...)} //mit C-Strings auf dem Stack,
    CString_D(char *pszInput)	{(...)} //da intern keine delete-Operation
    CString_D(char cInput)		{(...)} //vorgenommen wird.
    ~CString_D()			{(...)} //Destruktor
    (...)
    //Hier kommt das Problem:
    CString_D operator-(DWORD number)
    {
        //Erstellt einen Pufferstring
        BYTE *pTemp; //Zeiger auf Speicher im Heap
        try
        {
            if((pTemp=new BYTE[m_dwLenght-number])==NULL)
            throw CExceptionMemory();
        }
        catch(CExceptionMemory &amp;exception)
        {
        exception.low_memory();
        }
        (...)   
        //Nach der Bearbeitung soll der String zur Konstruktion 
        //eines CString_D-Objekts benutzt werden
        return CString_D(pTemp) //Hier ist der Fehler
        }
};
(...)
</code></pre>
<p>In diesem Beispiel wird in dem überladenem Operator - ein Zeiger auf Speicher im Heap eingerichtet. Doch der Speicher wird im Konstruktor nie freigegeben. Wenn ich allerdings eine delete-Operation in die Konstruktoren einbaue, haut mir mein Betriebssystem eine Fehlermeldung aus, sobald ich versuche, einen String als Argument auf dem Stack zu übergeben, da dieser Speicher nicht freigegeben werden kann. Deshalb: gibt es eine Möglichkeit, herauszufinden, ob ein Zeiger auf Speicher im Stack oder im Heap verweisst, am besten in einem if-Vergleich, und dann die jeweilige Aktion ausführen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675085</guid><dc:creator><![CDATA[Unbekannt]]></dc:creator><pubDate>Fri, 06 Mar 2009 09:40:23 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Heap und Stack on Fri, 06 Mar 2009 09:58:26 GMT]]></title><description><![CDATA[<pre><code>//Diese Konstruktoren arbeiten
//mit C-Strings auf dem Stack,
//da intern keine delete-Operation
//vorgenommen wird.
</code></pre>
<p>oO</p>
<pre><code>BYTE *pTemp; //Zeiger auf Speicher im Heap
        try
        {
            if((pTemp=new BYTE[m_dwLenght-number])==NULL)
            throw CExceptionMemory();
        }
        catch(CExceptionMemory &amp;exception)
        {
        exception.low_memory();
        }
        (...)  
        //Nach der Bearbeitung soll der String zur Konstruktion
        //eines CString_D-Objekts benutzt werden
        return CString_D(pTemp) //Hier ist der Fehler
        }
</code></pre>
<p>Du pruefst auf einen NULL-Zeiger bei new, dann wirfst du eine Exception um sie gleich danach wieder zu fangen und zu bearbeiten. Wie waere es mit einfachen if-Verschachtelung. Desweiteren ist die Namensgebung CExceptionMemory ungeschickt, besser vom Inhalt her trifft es wohl CMemoryException ...</p>
<blockquote>
<p>gibt es eine Möglichkeit, herauszufinden, ob ein Zeiger auf Speicher im Stack oder im Heap verweisst</p>
</blockquote>
<p>Nein!</p>
<blockquote>
<p>da &lt;string&gt; meiner Meinung nach relativ schwierig zu handhaben ist</p>
</blockquote>
<p>Echt? Finde ich nicht und ich muss taeglich damit arbeiten. Ausserdem ist es ein schlechter Grund, Standards solltest du persoenlichen Vorlieben vorziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675090</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 06 Mar 2009 09:58:26 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Heap und Stack on Fri, 06 Mar 2009 09:57:15 GMT]]></title><description><![CDATA[<p>Na toll. Trotzdem, danke für die Hilfe. (Werde ich wohl einen eigenständigen Konstruktor kreieren müssen...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675099</guid><dc:creator><![CDATA[Unbekannt]]></dc:creator><pubDate>Fri, 06 Mar 2009 09:57:15 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu Heap und Stack on Fri, 06 Mar 2009 13:05:22 GMT]]></title><description><![CDATA[<p>Das hat nicht viel Sinn, was du versuchst. Erstens scheinst du dich nicht sehr gut mit manueller Speicherverwaltung auszukennen (beispielsweise wirft <code>new</code> bei Fehlschlag eine <code>std::bad_alloc</code> , anstatt einen Nullzeiger zurückzugeben). Zweitens sind die Konstrukte aus der Standardbibliothek vorerst immer vorzuziehen, ausser man hat einen guten Grund (zum Beispiel eine spezielle Funktionalität oder wirklich schlimme Performanceprobleme), was aber selten vorkommt.</p>
<p>Mich würde bei der Gelegenheit auch mal interessieren, was du an der Handhabung von <code>std::string</code> schwierig findest - und welche Vorteile du dir im Gegenzug von deiner eigenen Klasse erhoffst. Viel einfacher als <code>std::string</code> kann man sich meines Erachtens eine Zeichenketten-Verwaltungsklasse nicht mehr vorstellen. Zudem hast du da Fehlerabfragen, Assertions, das Iteratoren- und Algorithmenkonzept, das du selber auch alles implementieren müsstest. So trivial ist das nicht.</p>
<p>Kurz gesagt, der Aufwand lohnt sich nicht wirklich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675229</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 06 Mar 2009 13:05:22 GMT</pubDate></item></channel></rss>