<?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[Warning beim deleten von Zeiger Array]]></title><description><![CDATA[<p>Warum kommt da ein &quot;warning&quot;?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    Mammal();
    ~Mammal();
    inline virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}

    private:
    int m_Age;
};

Mammal::Mammal()
:m_Age(12)
{
    cout &lt;&lt; &quot;Mammal Konstruktor\n&quot;;
}

Mammal::~Mammal()
{
    cout &lt;&lt; &quot;Mammal Destruktor\n&quot;;
}

class Cat : public Mammal
{
    public:
    Cat();
    ~Cat();
    inline void Speak() const {cout &lt;&lt; &quot;Miau\n&quot;;}
    inline void Purr() const {cout &lt;&lt; &quot;rrrrrr\n&quot;;}

    private:
};

Cat::Cat()
{
    cout &lt;&lt; &quot;Cat Konstruktor\n&quot;;
}

Cat::~Cat()
{
    cout &lt;&lt; &quot;Cat Destruktor\n&quot;;
}

class Dog : public Mammal
{
    public:
    Dog();
    ~Dog();
    inline void Speak() const {cout &lt;&lt; &quot;Wuff\n&quot;;}

    private:
};

Dog::Dog()
{
    cout &lt;&lt; &quot;Dog Konstruktor\n&quot;;
}
Dog::~Dog()
{
    cout &lt;&lt; &quot;Dog Destruktor\n&quot;;
}

int main()
{
    const size_t NUM_MAMMAL=3;
    Mammal *Zoo[3];
    for (int i=0;i&lt;NUM_MAMMAL;i++)
    {
        int choice;
        cout &lt;&lt; &quot;(1) &lt;- Katze      (2) &lt;- Hund\n&quot;;
        cin &gt;&gt; choice;
        switch (choice)
        {
            case 1:
            Zoo[i]=new Cat;
            break;

            case 2:
            Zoo[i]=new Dog;
            break;
        }
    }
    cout &lt;&lt; &quot;\n\n\n&quot;;
    for (int i=0;i&lt;NUM_MAMMAL;i++)
    {
        Zoo[i]-&gt;Speak();
        Cat *temp=dynamic_cast&lt;Cat *&gt; (Zoo[i]);
        if (!temp)
        {
            cout &lt;&lt; &quot;Leider keine Katze\n&quot;;
        }
        else
        {
            temp-&gt;Purr();
        }
        delete temp;
    }
    delete [] Zoo; // &lt;-- Zeile des Unheils

    return 0;
}
</code></pre>
<p>COMPILERMELDUNG:</p>
<blockquote>
<p>Compiling: C:\MinGW\Andi\kapitel 18.cpp<br />
C:\MinGW\Andi\kapitel 18.cpp: In function <code>int main()': C:\\MinGW\\Andi\\kapitel 18.cpp:105: warning: deleting array</code>Mammal*Zoo[3]'<br />
Linking console executable: C:\MinGW\Andi\kapitel 18.exe<br />
Process terminated with status 0 (0 minutes, 0 seconds)<br />
0 errors, 1 warnings</p>
<p>Checking for existence: C:\MinGW\Andi\kapitel 18.exe<br />
Executing: C:\MinGW/cb_console_runner.exe &quot;C:\MinGW\Andi\kapitel 18.exe&quot; (in C:\MinGW\Andi)<br />
Process terminated with status -1073741510 (0 minutes, 10 seconds)</p>
</blockquote>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192515/warning-beim-deleten-von-zeiger-array</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 12:36:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192515.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Sep 2007 13:00:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sat, 15 Sep 2007 13:00:28 GMT]]></title><description><![CDATA[<p>Warum kommt da ein &quot;warning&quot;?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    Mammal();
    ~Mammal();
    inline virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}

    private:
    int m_Age;
};

Mammal::Mammal()
:m_Age(12)
{
    cout &lt;&lt; &quot;Mammal Konstruktor\n&quot;;
}

Mammal::~Mammal()
{
    cout &lt;&lt; &quot;Mammal Destruktor\n&quot;;
}

class Cat : public Mammal
{
    public:
    Cat();
    ~Cat();
    inline void Speak() const {cout &lt;&lt; &quot;Miau\n&quot;;}
    inline void Purr() const {cout &lt;&lt; &quot;rrrrrr\n&quot;;}

    private:
};

Cat::Cat()
{
    cout &lt;&lt; &quot;Cat Konstruktor\n&quot;;
}

Cat::~Cat()
{
    cout &lt;&lt; &quot;Cat Destruktor\n&quot;;
}

class Dog : public Mammal
{
    public:
    Dog();
    ~Dog();
    inline void Speak() const {cout &lt;&lt; &quot;Wuff\n&quot;;}

    private:
};

Dog::Dog()
{
    cout &lt;&lt; &quot;Dog Konstruktor\n&quot;;
}
Dog::~Dog()
{
    cout &lt;&lt; &quot;Dog Destruktor\n&quot;;
}

int main()
{
    const size_t NUM_MAMMAL=3;
    Mammal *Zoo[3];
    for (int i=0;i&lt;NUM_MAMMAL;i++)
    {
        int choice;
        cout &lt;&lt; &quot;(1) &lt;- Katze      (2) &lt;- Hund\n&quot;;
        cin &gt;&gt; choice;
        switch (choice)
        {
            case 1:
            Zoo[i]=new Cat;
            break;

            case 2:
            Zoo[i]=new Dog;
            break;
        }
    }
    cout &lt;&lt; &quot;\n\n\n&quot;;
    for (int i=0;i&lt;NUM_MAMMAL;i++)
    {
        Zoo[i]-&gt;Speak();
        Cat *temp=dynamic_cast&lt;Cat *&gt; (Zoo[i]);
        if (!temp)
        {
            cout &lt;&lt; &quot;Leider keine Katze\n&quot;;
        }
        else
        {
            temp-&gt;Purr();
        }
        delete temp;
    }
    delete [] Zoo; // &lt;-- Zeile des Unheils

    return 0;
}
</code></pre>
<p>COMPILERMELDUNG:</p>
<blockquote>
<p>Compiling: C:\MinGW\Andi\kapitel 18.cpp<br />
C:\MinGW\Andi\kapitel 18.cpp: In function <code>int main()': C:\\MinGW\\Andi\\kapitel 18.cpp:105: warning: deleting array</code>Mammal*Zoo[3]'<br />
Linking console executable: C:\MinGW\Andi\kapitel 18.exe<br />
Process terminated with status 0 (0 minutes, 0 seconds)<br />
0 errors, 1 warnings</p>
<p>Checking for existence: C:\MinGW\Andi\kapitel 18.exe<br />
Executing: C:\MinGW/cb_console_runner.exe &quot;C:\MinGW\Andi\kapitel 18.exe&quot; (in C:\MinGW\Andi)<br />
Process terminated with status -1073741510 (0 minutes, 10 seconds)</p>
</blockquote>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365855</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 15 Sep 2007 13:00:28 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sat, 15 Sep 2007 13:17:26 GMT]]></title><description><![CDATA[<p>Dein Array liegt auf dem Stack, das darfst du gar nicht löschen.<br />
Du schreibst ja auch nicht das hier:</p>
<pre><code class="language-cpp">int i;
delete &amp;i;
</code></pre>
<p>Eigentlich willst du nur die einzelnen Elemente löschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365865</guid><dc:creator><![CDATA[TomasRiker]]></dc:creator><pubDate>Sat, 15 Sep 2007 13:17:26 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sat, 15 Sep 2007 13:48:42 GMT]]></title><description><![CDATA[<p>Mh, also so is es dann richtig:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    Mammal();
    ~Mammal();
    inline virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}

    private:
    int m_Age;
};

Mammal::Mammal()
:m_Age(12)
{
    cout &lt;&lt; &quot;Mammal Konstruktor\n&quot;;
}

Mammal::~Mammal()
{
    cout &lt;&lt; &quot;Mammal Destruktor\n&quot;;
}

class Cat : public Mammal
{
    public:
    Cat();
    ~Cat();
    inline void Speak() const {cout &lt;&lt; &quot;Miau\n&quot;;}
    inline void Purr() const {cout &lt;&lt; &quot;rrrrrr\n&quot;;}

    private:
};

Cat::Cat()
{
    cout &lt;&lt; &quot;Cat Konstruktor\n&quot;;
}

Cat::~Cat()
{
    cout &lt;&lt; &quot;Cat Destruktor\n&quot;;
}

class Dog : public Mammal
{
    public:
    Dog();
    ~Dog();
    inline void Speak() const {cout &lt;&lt; &quot;Wuff\n&quot;;}

    private:
};

Dog::Dog()
{
    cout &lt;&lt; &quot;Dog Konstruktor\n&quot;;
}
Dog::~Dog()
{
    cout &lt;&lt; &quot;Dog Destruktor\n&quot;;
}

int main()
{
    const size_t NUM_MAMMAL=3;
    Mammal *Zoo[3];
    for (int i=0;i&lt;NUM_MAMMAL;i++)
    {
        int choice;
        cout &lt;&lt; &quot;(1) &lt;- Katze      (2) &lt;- Hund\n&quot;;
        cin &gt;&gt; choice;
        switch (choice)
        {
            case 1:
            Zoo[i]=new Cat;
            break;

            case 2:
            Zoo[i]=new Dog;
            break;
        }
    }
    cout &lt;&lt; &quot;\n\n\n&quot;;
    for (int i=0;i&lt;NUM_MAMMAL;i++)
    {
        Zoo[i]-&gt;Speak();
        Cat *temp=dynamic_cast&lt;Cat *&gt; (Zoo[i]);
        if (!temp)
        {
            cout &lt;&lt; &quot;Leider keine Katze\n&quot;;
        }
        else
        {
            temp-&gt;Purr();
        }
        delete temp;
        delete Zoo[i];
    }

    return 0;
}
</code></pre>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox27898" checked="true" /><label for="checkbox27898">eine Adresse stand, die eine reservierte Stelle auf dem Heap angibt. Und ganz zum Schluss muss man den Heap ja immer iweder säubern, sonst --&gt; Speicherlecks...Fehler...etc.! Und deshalb kann man - hier z.B. über Zoo[x] - dann diese Stelle auf dem Heap ansprechen und löschen, weil der Zeiger weiß wo sie liegt...?</label></div></p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365881</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sat, 15 Sep 2007 13:48:42 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sat, 15 Sep 2007 14:47:38 GMT]]></title><description><![CDATA[<p>delete gehört zu new,<br />
delete[] gehört zu new[].</p>
<pre><code class="language-cpp">char* puffer = new char[1024];
// irgendwas tolles machen
delete[] puffer;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1365919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365919</guid><dc:creator><![CDATA[TomasRiker]]></dc:creator><pubDate>Sat, 15 Sep 2007 14:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sat, 15 Sep 2007 15:51:30 GMT]]></title><description><![CDATA[<p>Du brauchst das</p>
<pre><code class="language-cpp">delete temp;
</code></pre>
<p>nicht. temp ist ja nur eine gecastete Version des Original-Objekts im Array.</p>
<p>Eine bessere Version wäre:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
        Mammal();
        virtual ~Mammal(); //virtual hinzugefügt
        inline virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}
    private:
        int m_Age;
};

Mammal::Mammal() : m_Age(12)
{
    cout &lt;&lt; &quot;Mammal Konstruktor\n&quot;;
}

Mammal::~Mammal()
{
    cout &lt;&lt; &quot;Mammal Destruktor\n&quot;;
}

class Cat : public Mammal
{
    public:
        Cat();
        virtual ~Cat(); //virtual hinzugefügt
        inline void Speak() const {cout &lt;&lt; &quot;Miau\n&quot;;}
        inline void Purr() const {cout &lt;&lt; &quot;rrrrrr\n&quot;;}
    private:
};

Cat::Cat()
{
    cout &lt;&lt; &quot;Cat Konstruktor\n&quot;;
}

Cat::~Cat()
{
    cout &lt;&lt; &quot;Cat Destruktor\n&quot;;
}

class Dog : public Mammal
{
    public:
        Dog();
        virtual ~Dog(); //virtual hinzugefügt
        inline void Speak() const {cout &lt;&lt; &quot;Wuff\n&quot;;}
    private:
};

Dog::Dog()
{
    cout &lt;&lt; &quot;Dog Konstruktor\n&quot;;
}
Dog::~Dog()
{
    cout &lt;&lt; &quot;Dog Destruktor\n&quot;;
}

int main()
{
    const size_t NUM_MAMMAL=3;
    Mammal *Zoo[NUM_MAMMAL]; //wieso benutzt du hier vorher 3 und nicht NUM_MAMMAL?
    for (int i=0;i&lt;NUM_MAMMAL;i++)
    {
        int choice;
        cout &lt;&lt; &quot;(1) &lt;- Katze      (2) &lt;- Hund\n&quot;;
        cin &gt;&gt; choice;
        switch (choice)
        {
            case 1:
                Zoo[i]=new Cat;
                break;

            case 2:
                Zoo[i]=new Dog;
                break;
        }
    }
    cout &lt;&lt; &quot;\n\n\n&quot;;
    for (int i=0;i&lt;NUM_MAMMAL;i++)
    {
        Zoo[i]-&gt;Speak();
        Cat *temp=dynamic_cast&lt;Cat *&gt; (Zoo[i]);
        if (!temp)
        {
            cout &lt;&lt; &quot;Leider keine Katze\n&quot;;
        }
        else
        {
            temp-&gt;Purr();
        }
        //delete temp; Die Zeile ist nicht notwendig.
        delete Zoo[i];
    }
    return 0;
}
</code></pre>
<p>Zur Begründung: delete temp ist unnötig/sogar falsch, da es vorkommen kann, dass du ein bereits gelöschtes Objekt (falls es eine Katze war) löschst und dann mit delete Zoo[i]; nochmal löschen willst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> du zerschießt dir deinen Heap/undefiniertes Verhalten.</p>
<p>Zu den virtuellen Destruktoren (eigtl. hätte man die nur in der Basisklasse virtuell deklarieren müssen, da es in den abgeleiteten Klassen dann implitzit geschieht, aber so ist es halt nocheinmal explizit): Als Faustregel sollte jede Klasse mit mindestens einer virtuellen Methode einen virtuellen Destruktor haben, da sonst bei einem delete über einen Zeiger der Basisklasse nur der Destruktor der Basisklasse aufgerufen wird, was zu Fehlern führt, wenn eine abgeleitete Klasse Ressourcen wie Speicher oder Dateien allokiert.</p>
<p>Und natürlich sollte man dynamic_cast wenn möglich meiden (weist auf schlechtes Design hin ;). Aber das Beispiel war ja nur dazu da, dynamic_cast auszuprobieren.</p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365961</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sat, 15 Sep 2007 15:51:30 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sun, 16 Sep 2007 09:41:46 GMT]]></title><description><![CDATA[<p>Achso, man soll &quot;temp&quot; nicht deleten. Ich hab mir das nämlich imemr so gedacht, das der dynamic_cast halt für delete Speicher reserviert, und in diesen dann den Cat Teil reinpresst. Aber scheinend ist es so das gar kein neuer Speicher reserviert wird, sondern das &quot;temp&quot; dann irgendwie auf die gleiche Adresse wie Cat zugreift? Oder wie genau funktioniert dass, oder ist es zu komplex?</p>
<p>TomasRiker schrieb:</p>
<blockquote>
<p>delete gehört zu new,<br />
delete[] gehört zu new[].</p>
<pre><code class="language-cpp">char* puffer = new char[1024];
// irgendwas tolles machen
delete[] puffer;
</code></pre>
</blockquote>
<p>Okay, die Regel hab ich verstanden, aber wir greife ich mit &quot;puffer&quot; jetzt z.B. auf &quot;Feld 235&quot; zu? Ich kann mich noch dunkeln erinnern das es da was gab, das wenn man &quot;++&quot; macht das es ein Feld hoch geht, und bei &quot;--&quot; eins runter? Kann ich auch einfach z.B. &quot;puffer[235]&quot; machen? ....Kann mir das mal nochmal jemand erklären, ich nutze sowas so selten irgendwie..</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1366199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366199</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sun, 16 Sep 2007 09:41:46 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sun, 16 Sep 2007 10:17:58 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>Ich kann mich noch dunkeln erinnern das es da was gab, das wenn man &quot;++&quot; macht das es ein Feld hoch geht, und bei &quot;--&quot; eins runter? Kann ich auch einfach z.B. &quot;puffer[235]&quot; machen? ....Kann mir das mal nochmal jemand erklären, ich nutze sowas so selten irgendwie..</p>
</blockquote>
<p>wenn du einen *char <em>puffer = new char[1024];</em> hast, dann kannst du mit <em>puffer[0]...puffer[1023]</em> bzw. <em>*puffer...*(puffer+1023)</em> auf die einzelnen elemente zugreifen.<br />
übrigens, falls du den pointer hoch- oder runterzählen willst: du brauchst den originalwert für's delete d.h. du solltest irgendwie dafür sorgen, dass der dabei nicht verloren geht.<br />
<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/1366215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366215</guid><dc:creator><![CDATA[Undertaker]]></dc:creator><pubDate>Sun, 16 Sep 2007 10:17:58 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sun, 16 Sep 2007 10:26:21 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>Achso, man soll &quot;temp&quot; nicht deleten. Ich hab mir das nämlich immer so gedacht, das der dynamic_cast halt für delete Speicher reserviert, und in diesen dann den Cat Teil reinpresst. Aber scheinend ist es so das gar kein neuer Speicher reserviert wird, sondern das &quot;temp&quot; dann irgendwie auf die gleiche Adresse wie Cat zugreift? Oder wie genau funktioniert dass, oder ist es zu komplex?</p>
</blockquote>
<p>dynamic_cast überprüft anhand des Eintrags in der v-table, ob der Cast zur abgeleiteten Klasse legal ist (d.h. ob das Objekt, auf das gezeigt wird überhaupt eine Instanz der abgeleiteten Klasse ist) und gibt dann einen Zeiger auf <strong>die gleiche Adresse</strong> zurück (oder 0, falls der Cast nicht legal war). Das heißt, du darfst nur einen der beiden Zeiger deleten. Wenn du virtuelle Destruktoren benutzt (und das solltest du), ist es egal welcher von beiden Zeiger verwendet wird, da aber der Original-Zeiger auch für Objekte, die keine Instanz von Cat sind gelöscht werden, ist es einheitlicher, delete auf den nicht-gecasteten Zeiger anzuwenden.</p>
<p>Ich hoffe, man versteht diesen Bandwurmsatz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1366225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366225</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sun, 16 Sep 2007 10:26:21 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sun, 16 Sep 2007 10:42:58 GMT]]></title><description><![CDATA[<p>Undertaker schrieb:</p>
<blockquote>
<p>übrigens, falls du den pointer hoch- oder runterzählen willst: du brauchst den originalwert für's delete d.h. du solltest irgendwie dafür sorgen, dass der dabei nicht verloren geht.</p>
</blockquote>
<p>Gut das du mir dass sagst. Aber schätzungweiße ich hab jetzt schon so viel mit &quot;++&quot; u. &quot;--&quot; rumgespielt, und ich gar kein plan mehr habe wo ich mich im Fled befinde, und wie ich wieder zum anfang zurückkomme, kann ich dann nicht einfach:</p>
<pre><code class="language-cpp">delete [](puffer[0]);
</code></pre>
<p>machen? Oder geht das nicht?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7719">@Phoemuex</a><br />
Hab ich verstanden. Danke.</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1366230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366230</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sun, 16 Sep 2007 10:42:58 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sun, 16 Sep 2007 11:12:56 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>... kann ich dann nicht einfach:</p>
<pre><code class="language-cpp">delete [](puffer[0]);
</code></pre>
<p>machen? Oder geht das nicht?</p>
</blockquote>
<p>so gehts</p>
<p><strong>delete [] &amp;puffer[0];</strong><br />
oder<br />
<strong>delete [] puffer;</strong><br />
<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/1366243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366243</guid><dc:creator><![CDATA[ohaoha]]></dc:creator><pubDate>Sun, 16 Sep 2007 11:12:56 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sun, 16 Sep 2007 11:58:35 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>Undertaker schrieb:</p>
<blockquote>
<p>übrigens, falls du den pointer hoch- oder runterzählen willst: du brauchst den originalwert für's delete d.h. du solltest irgendwie dafür sorgen, dass der dabei nicht verloren geht.</p>
</blockquote>
<p>Gut das du mir dass sagst. Aber schätzungweiße ich hab jetzt schon so viel mit &quot;++&quot; u. &quot;--&quot; rumgespielt, und ich gar kein plan mehr habe wo ich mich im Fled befinde, und wie ich wieder zum anfang zurückkomme, kann ich dann nicht einfach:</p>
</blockquote>
<p>einfach die adresse zwischenspeichern. guckst du:</p>
<pre><code class="language-cpp">char *puffer = new char[...];
char *saved = puffer;
/*
 * hier irgendwie wild 'puffer' verändern
 */
delete[] saved; // &lt;-- voilà tout
</code></pre>
<p><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/1366282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366282</guid><dc:creator><![CDATA[Undertaker]]></dc:creator><pubDate>Sun, 16 Sep 2007 11:58:35 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sun, 16 Sep 2007 14:33:57 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16045">@Undertaker</a><br />
Okay, is klar so mach ich das dann wohl. Aber am besten wirs einfach sein wenn ich nen Überlick darüber behalte wo ich mich gerade im Feld befinde.</p>
<p>ohaoha schrieb:</p>
<blockquote>
<p>delete [] &amp;puffer[0];<br />
oder<br />
delete [] puffer;</p>
</blockquote>
<p>Also das mit &quot;delete [] puffer&quot; hab ich ja gemeint, aber das funzt ja nicht mehr wenn ich kein plan habe wo ich mich im Feld befinde.<br />
Und &quot;delete [] &amp;puffer[0]&quot;, mh da muss ich nochmal drüber nachdenken, des check ich noch nicht so ganz. Brauch bisschen Nachhilfe, also wenn ich nen Zeiger habe: int *temp; Der reservierten Speicher beinhaltet: int *temp=new int;</p>
<pre><code class="language-cpp">cout &lt;&lt; temp &lt;&lt; endl; // Jetzt wird doch die Adresse von dem reservierten Speicher ausgegeben oder?

cout &lt;&lt; &amp;temp &lt;&lt; endl; // Jetzt wird doch die Adresse von dem Zeiger &quot;temp&quot; ausgegeben oder?

//Oder ist es umgekehrt?
</code></pre>
<p>Was passiert dann in dem Fall &quot;delete [] &amp;puffer[0]; &quot; von &quot;ohaoha&quot;? Weil &quot;&amp;puffer&quot; müsste ja dann die Adresse des Zeigers sein? Oder verhält sich das in diesem Fall irgendwie anderst? Bin ich verwirrt?</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1366376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366376</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sun, 16 Sep 2007 14:33:57 GMT</pubDate></item><item><title><![CDATA[Reply to Warning beim deleten von Zeiger Array on Sun, 16 Sep 2007 16:10:36 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16045">@Undertaker</a><br />
Okay, is klar so mach ich das dann wohl. Aber am besten wirs einfach sein wenn ich nen Überlick darüber behalte wo ich mich gerade im Feld befinde.</p>
<p>ohaoha schrieb:</p>
<blockquote>
<p>delete [] &amp;puffer[0];<br />
oder<br />
delete [] puffer;</p>
</blockquote>
<p>Also das mit &quot;delete [] puffer&quot; hab ich ja gemeint, aber das funzt ja nicht mehr wenn ich kein plan habe wo ich mich im Feld befinde.<br />
Und &quot;delete [] &amp;puffer[0]&quot;, mh da muss ich nochmal drüber nachdenken, des check ich noch nicht so ganz. Brauch bisschen Nachhilfe, also wenn ich nen Zeiger habe: int *temp; Der reservierten Speicher beinhaltet: int *temp=new int;</p>
<pre><code class="language-cpp">cout &lt;&lt; temp &lt;&lt; endl; // Jetzt wird doch die Adresse von dem reservierten Speicher ausgegeben oder?

cout &lt;&lt; &amp;temp &lt;&lt; endl; // Jetzt wird doch die Adresse von dem Zeiger &quot;temp&quot; ausgegeben oder?

//Oder ist es umgekehrt?
</code></pre>
<p>Was passiert dann in dem Fall &quot;delete [] &amp;puffer[0]; &quot; von &quot;ohaoha&quot;? Weil &quot;&amp;puffer&quot; müsste ja dann die Adresse des Zeigers sein? Oder verhält sich das in diesem Fall irgendwie anderst? Bin ich verwirrt?</p>
<p>MfG<br />
Stromberg</p>
</blockquote>
<p>Ich ging davon aus, dass Du den puffer-Zeiger unverändert laesst und mit puffer[index++] durch Dein Feld gehst.<br />
puffer waere dann der unveraenderte Zeiger den new geliefert hat und den delete[] erwatet - puffer waere dann auch gleich &amp;puffer[0] !<br />
oder in deinem Beispiel:</p>
<pre><code class="language-cpp">int *temp=new int;
</code></pre>
<p>Hier waeren temp und &amp;temp[0] als Zeiger identisch.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1366447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366447</guid><dc:creator><![CDATA[ohaoha]]></dc:creator><pubDate>Sun, 16 Sep 2007 16:10:36 GMT</pubDate></item></channel></rss>