<?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[Frage zu TComponentList und CodeGuard]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich habe im Header</p>
<pre><code class="language-cpp">private:
TComponentList *liste;
</code></pre>
<p>und in der Unit</p>
<pre><code class="language-cpp">void __fastcall TForm1::FormCreate(TObject *Sender)
{
    liste = new TComponentList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &amp;Action)
{
    delete liste;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    liste-&gt;Add(Memo1);
}
</code></pre>
<p>Klappt auch &quot;scheinbar&quot; aber wenn ich CodeGuard aktiviere und damit compiliere und das Programm beenden ist alles OK. Drücke ich jedoch vor dem Beenden den Button1 und möchte anschliessend beenden kommt:</p>
<p><strong>Im Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 40025C9A in Modul 'VCL50.BPL'. Lesen von Adresse 8894889C'.</strong></p>
<p>Warum? Mach ich etwas falsch?</p>
<p>Das selbe passiert auch wenn ich zweiten Button mit diesem Code einfüge</p>
<pre><code class="language-cpp">void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TMemo *Memo = new TMemo(this);
    Memo-&gt;Visible = true;
    Memo-&gt;Parent = Form1;
    Memo-&gt;Left = 100;
    Memo-&gt;Top = 100;
    //delete Memo;
    liste-&gt;Add(Memo);
}
</code></pre>
<p>Ist das lediglich ein Bug im CodeGuard?</p>
<p>CodeGuard sagt in CGL Datei</p>
<blockquote>
<p>Fehler 00001. 0x100430 (Thread 0x070C):<br />
Zugriff in freigegebenem Speicher: Es wurde versucht, auf 4 Byte(s) bei<br />
0x011B7490 zuzugreifen.<br />
Aufrufhierarchie:<br />
0x004021EA(=Project1.exe:0x01:0011EA) C:\Programme\Borland\CBuilder5\Projects\TComponentList\Unit1.cpp#24<br />
0x400539C5(=VCL50.BPL:0x01:0529C5)<br />
0x40054117(=VCL50.BPL:0x01:053117)<br />
0x4006DF7B(=VCL50.BPL:0x01:06CF7B)<br />
0x400511D6(=VCL50.BPL:0x01:0501D6)<br />
0x7E368734(=user32.dll:0x01:007734)</p>
<p>Speicherblock (0x011B7490) [Größe: 24 Byte] war zugewiesen mit SysGetMem<br />
Aufrufhierarchie:<br />
0x40002C3A(=VCL50.BPL:0x01:001C3A)<br />
0x00402099(=Project1.exe:0x01:001099) C:\Programme\Borland\CBuilder5\Projects\TComponentList\Unit1.cpp#19<br />
0x40053323(=VCL50.BPL:0x01:052323)<br />
0x4005301F(=VCL50.BPL:0x01:05201F)<br />
0x4005ABFC(=VCL50.BPL:0x01:059BFC)<br />
0x00401C21(=Project1.exe:0x01:000C21) C:\Programme\Borland\CBuilder5\Projects\TComponentList\Project1.cpp#13</p>
<p>Speicherblock (0x011B7490) war freigegeben mit delete<br />
Aufrufhierarchie:<br />
0x32553990(=CC3250MT.DLL:0x01:052990)<br />
0x3255289A(=CC3250MT.DLL:0x01:05189A)<br />
0x32552ABA(=CC3250MT.DLL:0x01:051ABA)<br />
0x00403521(=Project1.exe:0x01:002521)<br />
0x7C91378B(=ntdll.dll:0x01:00278B)<br />
0x4000407B(=VCL50.BPL:0x01:00307B)</p>
</blockquote>
<p>C:\Programme\Borland\CBuilder5\Projects\TComponentList\Unit1.cpp#24<br />
ist: <strong>delete liste;</strong></p>
<p>C:\Programme\Borland\CBuilder5\Projects\TComponentList\Unit1.cpp#19<br />
ist: <strong>liste = new TComponentList;</strong></p>
<p>C:\Programme\Borland\CBuilder5\Projects\TComponentList\Project1.cpp#13<br />
ist: <strong>Application-&gt;CreateForm(__classid(TForm1), &amp;Form1);</strong></p>
<p>Wäre super wenn das wer erklären könnte <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/topic/180853/frage-zu-tcomponentlist-und-codeguard</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 21:08:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180853.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 May 2007 12:16:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Mon, 07 May 2007 12:16:25 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich habe im Header</p>
<pre><code class="language-cpp">private:
TComponentList *liste;
</code></pre>
<p>und in der Unit</p>
<pre><code class="language-cpp">void __fastcall TForm1::FormCreate(TObject *Sender)
{
    liste = new TComponentList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &amp;Action)
{
    delete liste;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    liste-&gt;Add(Memo1);
}
</code></pre>
<p>Klappt auch &quot;scheinbar&quot; aber wenn ich CodeGuard aktiviere und damit compiliere und das Programm beenden ist alles OK. Drücke ich jedoch vor dem Beenden den Button1 und möchte anschliessend beenden kommt:</p>
<p><strong>Im Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 40025C9A in Modul 'VCL50.BPL'. Lesen von Adresse 8894889C'.</strong></p>
<p>Warum? Mach ich etwas falsch?</p>
<p>Das selbe passiert auch wenn ich zweiten Button mit diesem Code einfüge</p>
<pre><code class="language-cpp">void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TMemo *Memo = new TMemo(this);
    Memo-&gt;Visible = true;
    Memo-&gt;Parent = Form1;
    Memo-&gt;Left = 100;
    Memo-&gt;Top = 100;
    //delete Memo;
    liste-&gt;Add(Memo);
}
</code></pre>
<p>Ist das lediglich ein Bug im CodeGuard?</p>
<p>CodeGuard sagt in CGL Datei</p>
<blockquote>
<p>Fehler 00001. 0x100430 (Thread 0x070C):<br />
Zugriff in freigegebenem Speicher: Es wurde versucht, auf 4 Byte(s) bei<br />
0x011B7490 zuzugreifen.<br />
Aufrufhierarchie:<br />
0x004021EA(=Project1.exe:0x01:0011EA) C:\Programme\Borland\CBuilder5\Projects\TComponentList\Unit1.cpp#24<br />
0x400539C5(=VCL50.BPL:0x01:0529C5)<br />
0x40054117(=VCL50.BPL:0x01:053117)<br />
0x4006DF7B(=VCL50.BPL:0x01:06CF7B)<br />
0x400511D6(=VCL50.BPL:0x01:0501D6)<br />
0x7E368734(=user32.dll:0x01:007734)</p>
<p>Speicherblock (0x011B7490) [Größe: 24 Byte] war zugewiesen mit SysGetMem<br />
Aufrufhierarchie:<br />
0x40002C3A(=VCL50.BPL:0x01:001C3A)<br />
0x00402099(=Project1.exe:0x01:001099) C:\Programme\Borland\CBuilder5\Projects\TComponentList\Unit1.cpp#19<br />
0x40053323(=VCL50.BPL:0x01:052323)<br />
0x4005301F(=VCL50.BPL:0x01:05201F)<br />
0x4005ABFC(=VCL50.BPL:0x01:059BFC)<br />
0x00401C21(=Project1.exe:0x01:000C21) C:\Programme\Borland\CBuilder5\Projects\TComponentList\Project1.cpp#13</p>
<p>Speicherblock (0x011B7490) war freigegeben mit delete<br />
Aufrufhierarchie:<br />
0x32553990(=CC3250MT.DLL:0x01:052990)<br />
0x3255289A(=CC3250MT.DLL:0x01:05189A)<br />
0x32552ABA(=CC3250MT.DLL:0x01:051ABA)<br />
0x00403521(=Project1.exe:0x01:002521)<br />
0x7C91378B(=ntdll.dll:0x01:00278B)<br />
0x4000407B(=VCL50.BPL:0x01:00307B)</p>
</blockquote>
<p>C:\Programme\Borland\CBuilder5\Projects\TComponentList\Unit1.cpp#24<br />
ist: <strong>delete liste;</strong></p>
<p>C:\Programme\Borland\CBuilder5\Projects\TComponentList\Unit1.cpp#19<br />
ist: <strong>liste = new TComponentList;</strong></p>
<p>C:\Programme\Borland\CBuilder5\Projects\TComponentList\Project1.cpp#13<br />
ist: <strong>Application-&gt;CreateForm(__classid(TForm1), &amp;Form1);</strong></p>
<p>Wäre super wenn das wer erklären könnte <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/1280254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280254</guid><dc:creator><![CDATA[Heinzi-kun]]></dc:creator><pubDate>Mon, 07 May 2007 12:16:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Mon, 07 May 2007 12:52:35 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Der Fehler im ersten Quellcode ist klar : Memo1 ist sicher eine IDE-verwaltete Komponenten. Damit ist auf jedenfall TForm1 für das Löschen dieser Komponente zuständig. Du setzt aber zusätzlich noch die TComponentList ein, das nun ebenfalls die Komponente löscht. Hier sollte als einfachste Lösung die Eigenschaft <em>TComponentList::OwnsObjects</em> helfen.</p>
<p>Im zweiten Fall kann ich jetzt nicht 100% einen Fehler nachvollziehen, dürfte aber den selben Grund haben.</p>
<p>ozu brauchst du überhaupt die TComponentList? Wenn du wirklich eine Untergruppe von Komponenten brauchst nimm lieber std::vector&lt;TComponent*&gt;, das kann nämlich direkt von TForm verwended werden und erfordert für sich selber keine dynamische Erstellung wie TC..L. Und beeinflußt auch die eigentlichen Komponent-Instanzen, versucht also nicht zu löschen. Wenn du nun alle Komponenten immer mit einem Owner versiehst, hast du auch ein einfaches und sauberes Speicherverhalten.</p>
<p>Nichtsdestotrotz solltest du niemals OnCreate oder OnDestroy verwenden, sondern stattdessen immer Konstruktoren und Destruktoren. Begründung findest du über SuFu.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280282</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 07 May 2007 12:52:35 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Mon, 07 May 2007 13:56:03 GMT]]></title><description><![CDATA[<p>Ich möchte eine interne Verwaltung für mich einbauen, wo ich in diesem Fall sehr viele TMemos hinzufügen/löschen und modifizieren kann.</p>
<p>Ich dachte eigentlich TComponentList ist genau dafür gedacht.<br />
TComponentList::OwnsObjects ist doch standard auf TRUE wenn man nichts sagt.<br />
Diese Änderung bewirkte keine Änderung.</p>
<pre><code class="language-cpp">liste = new TComponentList;
    liste-&gt;OwnsObjects = true;
</code></pre>
<p>Ok, ich habe mich mal an vector-Version rangetraut. Leider meldet die ebenfalls einen Fehler: <strong>In Project C:\...\Project1.exe trat ein Problem mit folgender Meldung auf: 'Zugriffsverletzung bei 0x0xd1bb45: Schreiben von Adresse 0x011b2524'. Prozess abngehalten.</strong><br />
und das DEBUG(COU) Fenster öffnet sich, womit ich garnichts anfangen kann *lalala*</p>
<p>Header</p>
<pre><code class="language-cpp">private:
vector&lt;TComponent*&gt; memos;
</code></pre>
<pre><code class="language-cpp">void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TMemo *Memo = new TMemo(this);
    Memo-&gt;Visible = false;
    Memo-&gt;Parent = Form1;
    Memo-&gt;Lines-&gt;Add(TimeToStr(Time()));

    memos.push_back(Memo);

    ComboBox1-&gt;Items-&gt;Clear();
    vector&lt;TComponent*&gt;::iterator mIter(memos.begin());
    while (mIter != memos.end())
    {
        TMemo *M = dynamic_cast&lt;TMemo*&gt;(*mIter);
        ComboBox1-&gt;Items-&gt;Add(M-&gt;Text);
        ++mIter;
    }
}
</code></pre>
<p>Die ComboBox enhält verschiedene Zeitangaben.. soweit wohl richtig, nur mit dem fehlerfreiem Beenden will es immernoch nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> *jammer*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280329</guid><dc:creator><![CDATA[Heinzi-kun]]></dc:creator><pubDate>Mon, 07 May 2007 13:56:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Mon, 07 May 2007 16:10:32 GMT]]></title><description><![CDATA[<p>Ich kann auch fehlerfrei auf den vector und die dort enthaltenen Memos zugreifern</p>
<pre><code class="language-cpp">void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
    TMemo *mem = dynamic_cast&lt;TMemo*&gt;(memos.at(ComboBox1-&gt;ItemIndex));
    if (mem) Caption = mem-&gt;Text;
}
</code></pre>
<p>Aber wieso meckert CodeGuard beim beenden? Wenn ich CodeGuard deaktiviere läuft das Programm fehlerfrei. Ich habe keine Ahnung, kann da wer bitte Einsicht bringen? <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>CodeGuard</p>
<pre><code>Fehler 00001. 0x400000 (Thread 0x0D30):
Exception 0xC0000005: Zugriffsverletzung bei 0x11B242C.
Aufrufhierarchie:
   0x0CD1BB45(=CG32.DLL:0x01:01AB45)
   0x0CD14BE9(=CG32.DLL:0x01:013BE9)
   0x0CD142FE(=CG32.DLL:0x01:0132FE)
   0x0CD1527E(=CG32.DLL:0x01:01427E)
   0x0CD2492E(=CG32.DLL:0x01:02392E)
   0x0CD010BB(=CG32.DLL:0x01:0000BB)

------------------------------------------
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1280416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280416</guid><dc:creator><![CDATA[Heinzi-kun]]></dc:creator><pubDate>Mon, 07 May 2007 16:10:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Mon, 07 May 2007 16:59:49 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Heinzi-kun schrieb:</p>
<blockquote>
<p>Diese Änderung bewirkte keine Änderung.</p>
<pre><code class="language-cpp">liste = new TComponentList;
    liste-&gt;OwnsObjects = true;
</code></pre>
</blockquote>
<p>Du sollst es ja auch auf false setzen.</p>
<blockquote>
<p>wo ich in diesem Fall sehr viele TMemos hinzufügen/löschen und modifizieren kann...<br />
Ok, ich habe mich mal an vector-Version rangetraut.</p>
</blockquote>
<p>Wenn du ausschließlich TMemos in der Liste behandeln willst nimm gleich std::vector&lt;TMemo*&gt;. Damit ersparst du dir das ganze gecaste und auf 0 überprüfen. (Wenn in deinem vector garantiert nur gültige TMemos sind)</p>
<blockquote>
<p>Aber wieso meckert CodeGuard beim beenden? Wenn ich CodeGuard deaktiviere läuft das Programm fehlerfrei. Ich habe keine Ahnung, kann da wer bitte Einsicht bringen?</p>
</blockquote>
<p>Konkrete Probleme kann ich nun auch nicht mehr sehen. Aber ich frag mich warum du unsichtbare Memos verwendest? Warum du Memos erschaffst, deren garantiert leeren Inhalt in eine Combobox einfügst und die Memos selber &quot;vergisst&quot; (und auch niocht in den vector eingetragen werden) ?<br />
Falls das nur ein Teil der eigentlichen Routine ist, dann kann da natürlich noch ein Problem sein.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280438</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 07 May 2007 16:59:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Mon, 07 May 2007 17:56:15 GMT]]></title><description><![CDATA[<p>Danke für die Antwort.</p>
<p>liste-&gt;OwnsObjects hatte ich auf true und false probiert. Hatte leider nichts gebracht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<blockquote>
<p>Wenn du ausschließlich TMemos in der Liste behandeln willst nimm gleich std::vector&lt;TMemo*&gt;. Damit ersparst du dir das ganze gecaste und auf 0 überprüfen. (Wenn in deinem vector garantiert nur gültige TMemos sind)</p>
</blockquote>
<p>Ja das stimmt, aber 0 überprüfen muss doch bleiben, kann ja sein das mal ein Index irgendwo versagt und das Memo nicht mehr existiert ^^</p>
<blockquote>
<p>Warum du Memos erschaffst, deren garantiert leeren Inhalt in eine Combobox einfügst und die Memos selber &quot;vergisst&quot; (und auch niocht in den vector eingetragen werden)?</p>
</blockquote>
<p>Den Satz verstehe ich irgendwie nicht. Also grob gesagt habe ich eine GUI mit einem Eingabefeld(Memo) und dort tippe ich etwas rein und sage zum Beispiel &quot;ADD&quot; und will den Inhalt in mein vector&lt;Memo&gt; ablegen, später wieder aufrufen können, speichern, verschieben oder eben wieder löschen. Quasi eine kleine Verwaltung von Texten. Is nur kleiner Test. Das Prinzip brauch ich dann für etwas anderes später noch, ich taste mich so erstmal daran an.</p>
<p>Also ich gehe davon aus das ich in einer Funktion ein Memo erstelle(<strong>new</strong>) und dieses dann in vector ablege mich nicht mehr um das <strong>delete</strong> kümmern muss, da der vector bei Programmende das Memo selber sauber entfernt und ich somit auf meinen vector überall im Programm zugreifen kann und meine Memos mit INhalt beleben. Ebenfalls muss ich mich beim vector selbst um kein delete kümmern da er das selber erledigt.</p>
<p>Ist doch richtig oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280468</guid><dc:creator><![CDATA[Heinzi-kun]]></dc:creator><pubDate>Mon, 07 May 2007 17:56:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Mon, 07 May 2007 18:22:58 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Heinzi-kun schrieb:</p>
<blockquote>
<p>liste-&gt;OwnsObjects hatte ich auf true und false probiert. Hatte leider nichts gebracht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Spricht eher dafür das CodeGuard ein Problem hat.</p>
<blockquote>
<p>Ja das stimmt, aber 0 überprüfen muss doch bleiben, kann ja sein das mal ein Index irgendwo versagt und das Memo nicht mehr existiert ^^</p>
</blockquote>
<p>Programmieren hat etwas mit Präzision und Berechnung zu tun. Ein Code wo irgendwo etwas versagt und etwas nicht mehr existiert obwohl es noch gelistet wird ist ein schlechter Code, da helfen auch Überprüfungen nichts.</p>
<blockquote>
<p>Den Satz verstehe ich irgendwie nicht. Also grob gesagt habe ich eine GUI mit einem Eingabefeld(Memo) und dort tippe ich etwas rein und sage zum Beispiel &quot;ADD&quot; und will den Inhalt in mein vector&lt;Memo&gt; ablegen, später wieder aufrufen können, speichern, verschieben oder eben wieder löschen. Quasi eine kleine Verwaltung von Texten. Is nur kleiner Test. Das Prinzip brauch ich dann für etwas anderes später noch, ich taste mich so erstmal daran an.</p>
</blockquote>
<p>Damit meine ich das Memos die nicht mehr gebraucht werden, erstens gelöscht und zweites der entsprechende Pointer aus dem vector entfernt wird. Damit ist keine weitere Übeprüfung notwendig.</p>
<blockquote>
<p>Also ich gehe davon aus das ich in einer Funktion ein Memo erstelle(<strong>new</strong>) und dieses dann in vector ablege mich nicht mehr um das <strong>delete</strong> kümmern muss, da der vector bei Programmende das Memo selber sauber entfernt und ich somit auf meinen vector überall im Programm zugreifen kann und meine Memos mit INhalt beleben. Ebenfalls muss ich mich beim vector selbst um kein delete kümmern da er das selber erledigt.</p>
</blockquote>
<p>Nein, leider hast du einen Denkfehler drin. In der Tat löscht vector selber alle seine Elemente. In deinem Fall also jeden einzelnen Pointer auf ein Memo. <strong>Aber nicht die Memos selber!</strong> Der vector löscht also nicht die Memos ansich. In deinem konkreten Fall ist das aber kein Problem da du den Memos beim erstellen einen Owner übergibst (this, also höchstwahrscheinlich das Form). Dieser ist damit fü das löschen zuständig, es entstehen also aus dieser Ecke keine Speicherlöcher. Erst wenn du als Owner NULL übergibst must du in der Tat die Memos manuell löschen. Dann machen weder vector noch Form das für dich.</p>
<p>Ich weiße nochmal darauf hin das Memo eine visuelle Komponente ist. Deine Beschreibung klingt aber so als würde bei dir nichtvisuelle Komponenten wie TStringList ausreichen (weniger unnötiger Overhead)</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280492</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 07 May 2007 18:22:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Mon, 07 May 2007 18:47:48 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>Nein, leider hast du einen Denkfehler drin. In der Tat löscht vector selber alle seine Elemente. In deinem Fall also jeden einzelnen Pointer auf ein Memo. <strong>Aber nicht die Memos selber!</strong> Der vector löscht also nicht die Memos ansich. In deinem konkreten Fall ist das aber kein Problem da du den Memos beim erstellen einen Owner übergibst (this, also höchstwahrscheinlich das Form). Dieser ist damit fü das löschen zuständig, es entstehen also aus dieser Ecke keine Speicherlöcher. Erst wenn du als Owner NULL übergibst must du in der Tat die Memos manuell löschen. Dann machen weder vector noch Form das für dich.</p>
</blockquote>
<p>Oha! Das schlecht, also ist wohl ComponentList-&gt;Clear() doch besser. Ich habe ja die Möglichkeit auch über Menüpunkt &quot;Neu&quot; ein neues Projekt zu starten, dann würde ich irgendwann ja massenhaft von Memos haben, da diese nicht entfernt würden.<br />
Wie lösche ich denn die Memos in &lt;vector&gt;&quot;memos&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280521</guid><dc:creator><![CDATA[Heinzi-kun]]></dc:creator><pubDate>Mon, 07 May 2007 18:47:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 07:37:01 GMT]]></title><description><![CDATA[<p>Du löschst die memos mit delete bevor du sie aus dem vector entfernst. Also wenn du das Element i entfernen willst:</p>
<pre><code class="language-cpp">vector&lt;TMemo*&gt; memovect;
// irgendwelcher Code
delete memovect[i];
memovect.erase(memovect.begin()+i);
</code></pre>
<p>Wenn du den vector ganz löschen willst, mußt du dein delete in einer Schleife aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280678</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 08 May 2007 07:37:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 07:58:16 GMT]]></title><description><![CDATA[<p>Das ganze löschen geht auch super mit einem Template:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class delete_it_obj
{
	public:
		T operator() (T item)
		{
			delete item;
			return 0;
		}
};
template &lt;template &lt;class A&gt; class container_type, class T&gt; 
void delete_it(container_type&lt;T&gt; &amp;sequence) 
{ 
	std::transform(sequence.begin(), sequence.end(), sequence.begin(), delete_it_obj&lt;T&gt;());
}
</code></pre>
<p>Quelle: <a href="http://groups.google.de/group/borland.public.cppbuilder.language/browse_thread/thread/c5c1e906e43a0f79/5a1298a953f771f2?lnk=st&amp;q=How+to+delete+std%3A%3Avector+pointers%3F&amp;rnum=1&amp;hl=de#5a1298a953f771f2" rel="nofollow">http://groups.google.de/group/borland.public.cppbuilder.language/browse_thread/thread/c5c1e906e43a0f79/5a1298a953f771f2?lnk=st&amp;q=How+to+delete+std%3A%3Avector+pointers%3F&amp;rnum=1&amp;hl=de#5a1298a953f771f2</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280692</guid><dc:creator><![CDATA[VergissEs]]></dc:creator><pubDate>Tue, 08 May 2007 07:58:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 09:01:36 GMT]]></title><description><![CDATA[<p>Ich komme da irgendwie nicht mehr ganz mit. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Ich würde gern mal zum Anfang zurückgehen, falls CodeGuard einfach nen Bug hat.<br />
Das mit dem TMemo, welches zur Entwicklungszeit auf die TForm gesetzt wurde verstehe ich mit dem freigeben, aber das mit der zur Laufzeit mit <strong>new</strong> angelegten nicht.</p>
<p>Ich möchte beliebige Komponenten mit <strong>new</strong> erstellen und in eine Liste einfügen. Vorzugsweise TComponentList *MeineListe, da diese extra dafür gemacht wurde.<br />
Da die Komponenten in einer Funktion neu erstellt werden, gibt es kein <strong>delete</strong>, diese werden dann ja am Ende des Programmes mit &quot;delete MyListe&quot; alle entfernt.</p>
<p>Im Header meiner TForm steht im</p>
<pre><code class="language-cpp">private:
    TComponentList *MeineListe;
</code></pre>
<p>In der Unit steht (grob, da per Hand eben getippt)</p>
<pre><code class="language-cpp">void __fastcall TForm1::FormCreate(TObject *Sender)
{
    // MeineListe initalisieren
    MeineListe = new TComponentList;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // Füge bei jedem Klick auf den Button eine
    // TImage Komponente der MeineListe hinzu
    // Auf jede TImage Komponente in MeineListe kann ich seperat zugreifen und darauf zeichnen
    // Freigabe erfolgt über &quot;delete MeineListe&quot; in FormClose
    TImage *MyImage = new TImage(this);
    MeineListe-&gt;Add(MyImage);
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &amp;Action)
{
    // Wenn (MeineListe!=NULL) dann enthält diese Komponenten
    // mit delete werden all ihre Listen(Komponenten)einträge entfernt und
    // MeineListe ebenfalls freigegeben
    if (MeineListe) delete MeineListe;
}
</code></pre>
<p>So habe ich es gemacht (um mal was anderes als TMemo zu nehmen, soll ja mit allem gehen). Und so müsste es doch auch fehlerfrei sein oder missverstehe ich da etwas?</p>
<p>Ich kann beliebe Komponenten mit <strong>new</strong> in die TComponentList werfen und muss mich nicht um deren <strong>delete</strong> kümmern, da dieses mit &quot;delete MeineListe&quot; ebenfalls sauber entfernt werden.</p>
<p>Ich verstehe da nicht was CodeGuard rummuckt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280716</guid><dc:creator><![CDATA[Heinzi-kun]]></dc:creator><pubDate>Tue, 08 May 2007 09:01:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 09:39:31 GMT]]></title><description><![CDATA[<p>Um bei dem Beispiel mit new TImage(this) zu bleiben... Durch das this gibst Du einen Owner an. Dieser ist für das Löschen verantwortlich. Wenn Du die TImage-Objekte aus Deiner Lister heraus löschen möchtest, darfst Du keinen Eigentümer angeben, oder mußt die Liste so anlegen, dass nur die Pointer gelöscht werden, aber nicht die Instanzen.</p>
<p>In allen Projekten, die ich so gemacht habe, hatte der CodeGuard schlußendlich immer recht, auch wenn das Programm scheinbar korrekt funktionierte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280733</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 08 May 2007 09:39:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 10:19:23 GMT]]></title><description><![CDATA[<p>Mhh, um mal das für mich nachvollziehbar zu machen, bleib ich jetzt bei dem TMemo da ich jetzt die Umgebung zum testen dafür zur Hand habe.</p>
<p>Ich habe also ein leeres Projekt, dort plaziere ich eine Memo zur Entwicklungszeit rein. In den Header kommt</p>
<pre><code class="language-cpp">private:	// Anwender-Deklarationen
TComponentList *liste;
</code></pre>
<p>und in Unit</p>
<pre><code class="language-cpp">void __fastcall TForm1::FormCreate(TObject *Sender)
{
    liste = new TComponentList;
    liste-&gt;OwnsObjects = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &amp;Action)
{
    delete liste;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TMemo *Memo = new TMemo(this);
    Memo-&gt;Visible = false;
    Memo-&gt;Parent = Form1;
    liste-&gt;Add(Memo);
}
</code></pre>
<p>Ich sage meiner TComponentList das er nicht für das löschen der Komponenten zu sorgen hat (mittels liste-&gt;OwnsObjects = false).<br />
Über ButtonClick füge ich eine mit new erstellte Komponente in die TComponentenList hinzu.. da es mit dies mit this passiert muss ich mich um die Löschung nicht kümmern, da dies TForm1 selbst beim beendet sauber enternt.</p>
<p>Soweit schön und gut, aber wieso meckert dann CodeGuard über die Zeile &quot;delete liste;&quot;?<br />
Wenn ich das &quot;delete liste&quot; weg lasse .. dann meckert CodeGuard nicht und sagt alles roger. Verstehe ich nicht. Habe doch keinen Owner angegeben, also muss delete rein. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280760</guid><dc:creator><![CDATA[Heinzi-kun]]></dc:creator><pubDate>Tue, 08 May 2007 10:19:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 10:29:41 GMT]]></title><description><![CDATA[<p>Zusatzfrage zur obigen.</p>
<p>Ich möchte aber zwischendurch die Komponentenliste leeren, weil ich von vorn anfangen möchte. Dann wäre dies legitim?</p>
<pre><code class="language-cpp">void __fastcall TForm1::ResetClick(TObject *Sender)
{
    liste-&gt;OwnsObjects = true;
    liste-&gt;Clear();
    liste-&gt;OwnsObjects = false;
}
</code></pre>
<p>Er soll damit alle Objete in der TComponentList entfernen und die Einträge auch alle. So das ich neue Memos einfügen kann und sich während der Arbeit mit dem Programm nicht im Hinterfrund plötzlich hunderte nicht benutzte Memos ansammeln. <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>CodeGuard meldet zwar keinen Fehler, aber das muss ja nicht heissen das es richtig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280768</guid><dc:creator><![CDATA[Heinzi-kun]]></dc:creator><pubDate>Tue, 08 May 2007 10:29:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 10:43:09 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Heinzi-kun schrieb:</p>
<blockquote>
<p>Ich habe also ein leeres Projekt, dort plaziere ich eine Memo zur Entwicklungszeit rein. In den Header kommt<br />
...<br />
Wenn ich das &quot;delete liste&quot; weg lasse .. dann meckert CodeGuard nicht und sagt alles roger. Verstehe ich nicht. Habe doch keinen Owner angegeben, also muss delete rein. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Du verwendest OnCreate und OnClose. Damit hast du schon mal ein Problem, denn die beiden Events gehören nicht zusammen. Die korrekten Paare sind OnCreate/OnDestroy und OnShow/OnClose. Bei dir wäre theoretisch der Ablauf denkbar<br />
- Instanz des Forms wird erstellt : Aufruf von OnCreate, Liste wird erstellt<br />
- Instanz wird angezeigt : Aufruf von OnShow<br />
- Form wird geschlossen : Aufruf von OnClose, Liste wird gelöscht<br />
- Form wird wieder angezeigt : Aufruf von OnShow, Zugriff auf Liste... Zugriffsfehler</p>
<p>Das tritt bei dir so nicht auf weil dein Form das Hauptformular ist und beim Schließen gleich die Anwendung beenden. Darauf darfst du dich aber nicht verlassen. Denk immer dran : Ein geschlossenes (nicht sichtbares) Form heißt noch lange nicht das es wirklich gelöscht wird oder das die Anwendung beenden wird.<br />
Kann schon sein das CodeGuard dieses Problem sieht trotz das es praktisch bei dir nicht ausgelöst wird.</p>
<p>Übrigens ein weiter Grund OnCreate und OnDestroy nicht zu benutzen : Verwechslungsgefahr mit OnShow/OnClose.</p>
<blockquote>
<p>ch möchte aber zwischendurch die Komponentenliste leeren, weil ich von vorn anfangen möchte. Dann wäre dies legitim?...</p>
</blockquote>
<p>Sollte in Ordnung sein.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280777</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 08 May 2007 10:43:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 11:03:40 GMT]]></title><description><![CDATA[<p>Danke für deine umfangreiche Antwort!</p>
<p>Das mit Create/Destroy und Show/Close behalte ich im Hinterkopf, habe es mal entsprechend geändert.</p>
<p>Bleibt aber die Frage warum muss ich kein &quot;delete liste&quot; ausführen?<br />
In diesem Fall ist es egal ob es im Close oder Destroy steht, der Fehler bleibt der Selbe.</p>
<p>Wenn ich Create nicht benutzen sollte, dann soll ich das direkt ins &quot;__fastcall TForm1(TComponent* Owner);&quot; eintragen?</p>
<p>Es existiert aber kein Destructor in der TForm1 Klasse. Der wird wohl in der abgeleiteten TForm Klasse liegen.<br />
Muss ich jetzt VCL korrekt ein &quot;__fastcall ~TForm1();&quot; einfügen und dort meine Freigaben tätigen, oder wie sonst? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280791</guid><dc:creator><![CDATA[Heinzi-kun]]></dc:creator><pubDate>Tue, 08 May 2007 11:03:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 11:18:45 GMT]]></title><description><![CDATA[<p>Hallo</p>
<blockquote>
<p>Bleibt aber die Frage warum muss ich kein &quot;delete liste&quot; ausführen?<br />
In diesem Fall ist es egal ob es im Close oder Destroy steht, der Fehler bleibt der Selbe.</p>
</blockquote>
<p>Ich kann das Verhalten nicht nachvollziehen. Auf meinem BCB5 habe ich dein Test ausprobiert und folgendes festgestellt :<br />
- Ohne CodeGuard kommen keine Probleme<br />
- Mit CodeGuard wird egal ob OnDestroy oder Destruktor bei delete liste eine Speicherzugriffsverletzung angezeigt, aber nur wenn ein Memo in die liste eingetragen wurde.<br />
Das deutet eher auf ein internes Problem CodeGuard/VCL hin.</p>
<blockquote>
<p>Wenn ich Create nicht benutzen sollte, dann soll ich das direkt ins &quot;__fastcall TForm1(TComponent* Owner);&quot; eintragen?</p>
</blockquote>
<p>In die Implementation des Konstruktors, ja.</p>
<blockquote>
<p>Es existiert aber kein Destructor in der TForm1 Klasse. Der wird wohl in der abgeleiteten TForm Klasse liegen.<br />
Muss ich jetzt VCL korrekt ein &quot;__fastcall ~TForm1();&quot; einfügen und dort meine Freigaben tätigen, oder wie sonst? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Ja, der Destrukor muß manuell hinzugefügt werden.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280803</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 08 May 2007 11:18:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 11:50:02 GMT]]></title><description><![CDATA[<p>Ah, danke!<br />
Also muss das delete liste; wieder rein und muss mir wegen des Fehlers von CodeGuard keine gedanken machen. <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/1280830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280830</guid><dc:creator><![CDATA[Heinzi-kun]]></dc:creator><pubDate>Tue, 08 May 2007 11:50:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TComponentList und CodeGuard on Tue, 08 May 2007 12:09:43 GMT]]></title><description><![CDATA[<p>Ja, doch. In deinem ersten Post hast Du die Fehlermeldungen mit angegeben. Dort war das Problem definitiv, dass die Objekte die freigegeben werden sollten, zu diesem Zeitpunkt bereits freigegeben waren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280848</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 08 May 2007 12:09:43 GMT</pubDate></item></channel></rss>