<?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[Objekte einer Struktur richtig gelöscht?]]></title><description><![CDATA[<p>Hallo <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>
<p>Ich habe eine eigenene Objektstrukur erstellt. Wie viele Objekte dieser<br />
Struktur es gibt, verändert sich ständig und hängt davon ab wieviel 'Einheiten' im Speicher des Spiels existieren das ich auslese.</p>
<p>Problem: Das Programm leaked. Debugger meldet Heap corrupted. Meine Vermutung ist das ich entweder:<br />
a) Die Objekte der Struktur falsch lösche. Ist &quot;delete []Obj;&quot; korrekt? Oder muss ich da mit for irgendwie durchloopen? *verwirrt* Beim debuggen wird mir jedenfalls der Fehler bei dem &quot;delete []Obj&quot; in der Fkt. ReadObjects() angezeigt<br />
b) Während das Spiel im Ladebildschirm die Zone/das Level wechelt verändert sich die Speicherstruktur. Mein Programm hört während dieser Zeit nicht auf damit den Speicher des Spiel auszulesen. Da das Auslesen auf einigen Pointern beruht die in dieser Zeit eventl. 0 sind könnte es zu einer Zugriffsverletzung kommen. Allerdingt müsste mir der debugger das dann anders anzeigen und ACCESS VIOLATION melden.</p>
<pre><code>// meine Struktur in der ich ausgelesene Objektdaten abspeichere
struct SObj
{
    int     type;
    __int64 guid;
    float   x;
    float   y;
    float   z;
    int     health;
    int     level;
    char    name[40];
};

// Cmem ist meine Klasse zum auslesen eines fremden prozesses
class Cmem
{
    private:
        // andere variablen hier - prozesshanle, wndhandle, pid, etc
    public:
        Cmem();
        ~Cmem();
        char        *ReadSTR(long addr);
        __int64     ReadINT64(long addr);
        long        ReadINT32(long addr);
        float       ReadFLOAT(long addr);
        double      ReadDOUBLE(long addr);
        SObj        *Obj;
        int         foundobjects;
        void        ReadObjects();
};

Cmem::Cmem()
{
    foundobjects=0;
    Obj=0;
    // weitere variablen und pointer =0
}

Cmem::~Cmem()
{
    delete []Obj;
    // handles schließen und andere Sachen löschen
}

// ReadObjects wird 20 mal pro Sekunde aufgerufen
// Der ausgelesene Inhalt wird in einem OpenGL Fenster dargestellt
void Cmem::ReadObjects()
{
    delete []Obj;
    foundobjects=0;
    while ( ... )    // Pseudocode - Anzahl der Objekte ermitteln um dann x Objekte vom Typ SObj zu erstellen
    {
        // Hier wird geprüft ob ein weiteres Objekt im anderen Prozess zu finden ist
        // keins mehr da? -&gt; break;
        foundobjects++;
    }

    // Speicher reservieren um alle Objekte auslesen zu können
    Obj = new SObj[foundobjects];

    int n=0;
    DWORD tmp;
    while ( ... )    // Pseudocode - Objekte auslesen und abspeichern
    {
        // Speicher eines anderen Prozess auslesen und Infos abspeichern
        Obj[n].type=3;
        Obj[n].x=2.0f;
        Obj[n].y=8.0f;
        Obj[n].z=1.0f;
        // Sind alle Objekte ausgelesen wird while verlassen
        n++;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/221618/objekte-einer-struktur-richtig-gelöscht</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 02:28:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/221618.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Sep 2008 10:19:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekte einer Struktur richtig gelöscht? on Mon, 01 Sep 2008 10:19:21 GMT]]></title><description><![CDATA[<p>Hallo <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>
<p>Ich habe eine eigenene Objektstrukur erstellt. Wie viele Objekte dieser<br />
Struktur es gibt, verändert sich ständig und hängt davon ab wieviel 'Einheiten' im Speicher des Spiels existieren das ich auslese.</p>
<p>Problem: Das Programm leaked. Debugger meldet Heap corrupted. Meine Vermutung ist das ich entweder:<br />
a) Die Objekte der Struktur falsch lösche. Ist &quot;delete []Obj;&quot; korrekt? Oder muss ich da mit for irgendwie durchloopen? *verwirrt* Beim debuggen wird mir jedenfalls der Fehler bei dem &quot;delete []Obj&quot; in der Fkt. ReadObjects() angezeigt<br />
b) Während das Spiel im Ladebildschirm die Zone/das Level wechelt verändert sich die Speicherstruktur. Mein Programm hört während dieser Zeit nicht auf damit den Speicher des Spiel auszulesen. Da das Auslesen auf einigen Pointern beruht die in dieser Zeit eventl. 0 sind könnte es zu einer Zugriffsverletzung kommen. Allerdingt müsste mir der debugger das dann anders anzeigen und ACCESS VIOLATION melden.</p>
<pre><code>// meine Struktur in der ich ausgelesene Objektdaten abspeichere
struct SObj
{
    int     type;
    __int64 guid;
    float   x;
    float   y;
    float   z;
    int     health;
    int     level;
    char    name[40];
};

// Cmem ist meine Klasse zum auslesen eines fremden prozesses
class Cmem
{
    private:
        // andere variablen hier - prozesshanle, wndhandle, pid, etc
    public:
        Cmem();
        ~Cmem();
        char        *ReadSTR(long addr);
        __int64     ReadINT64(long addr);
        long        ReadINT32(long addr);
        float       ReadFLOAT(long addr);
        double      ReadDOUBLE(long addr);
        SObj        *Obj;
        int         foundobjects;
        void        ReadObjects();
};

Cmem::Cmem()
{
    foundobjects=0;
    Obj=0;
    // weitere variablen und pointer =0
}

Cmem::~Cmem()
{
    delete []Obj;
    // handles schließen und andere Sachen löschen
}

// ReadObjects wird 20 mal pro Sekunde aufgerufen
// Der ausgelesene Inhalt wird in einem OpenGL Fenster dargestellt
void Cmem::ReadObjects()
{
    delete []Obj;
    foundobjects=0;
    while ( ... )    // Pseudocode - Anzahl der Objekte ermitteln um dann x Objekte vom Typ SObj zu erstellen
    {
        // Hier wird geprüft ob ein weiteres Objekt im anderen Prozess zu finden ist
        // keins mehr da? -&gt; break;
        foundobjects++;
    }

    // Speicher reservieren um alle Objekte auslesen zu können
    Obj = new SObj[foundobjects];

    int n=0;
    DWORD tmp;
    while ( ... )    // Pseudocode - Objekte auslesen und abspeichern
    {
        // Speicher eines anderen Prozess auslesen und Infos abspeichern
        Obj[n].type=3;
        Obj[n].x=2.0f;
        Obj[n].y=8.0f;
        Obj[n].z=1.0f;
        // Sind alle Objekte ausgelesen wird while verlassen
        n++;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1574577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574577</guid><dc:creator><![CDATA[guestcoder]]></dc:creator><pubDate>Mon, 01 Sep 2008 10:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte einer Struktur richtig gelöscht? on Mon, 01 Sep 2008 11:48:20 GMT]]></title><description><![CDATA[<p>sieht vom löschen und allokieren her ganz ok aus...</p>
<p>also sollte kein speicherleck entstehen, jedenfalls nicht in dem code</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574637</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 01 Sep 2008 11:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte einer Struktur richtig gelöscht? on Mon, 01 Sep 2008 13:51:41 GMT]]></title><description><![CDATA[<p>Ok ich habe den Fehler gefunden.</p>
<p>Dazu muss ich sagen das meine beiden While-Schleifen in der Read-Funktion durch eine Liste von Pointern im Speicher des Spiels springen. Der Fehler war: Ich ging davon aus das sich in der Zeit von Schleife 1 zu Schleife 2 der Speicher nicht verändert -&gt; die zweite Schleife sollte so oft aufgerufen werden wie in 'foundobjects' gespeichert. Nun kommt es aber selten vor das in dieser sehr kurzen Zeit ein neues Objekt vom Spiel geladen wird. Das hat zur Folge das Schleife zwei einmal zu viel aufgerufen wird und versucht die Daten in die Bereicht volle 'Obj'-Struktor zu schreiben.</p>
<p>Lösung? als erstes in die zweite while Schleife einbauen:</p>
<pre><code>if (n&gt;=foundobjects)
{
    break;
}
</code></pre>
<p>läuft hammergeil jetzt *wohoo* <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Habe aber laaange gebraucht um das rauszufinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574779</guid><dc:creator><![CDATA[guestcoder]]></dc:creator><pubDate>Mon, 01 Sep 2008 13:51:41 GMT</pubDate></item></channel></rss>