<?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[&amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list]]></title><description><![CDATA[<p>Hi,<br />
Ich hab ein Problem mit meiner std::list</p>
<pre><code class="language-cpp">//zeichnet alles mit wxWidgets
void Window::DrawScene(wxPaintEvent&amp; evt) {
    wxPaintDC dc(this);
    for (std::list&lt;Object&gt;::const_iterator tObject = obejcts.begin(); tObject != objects.end(); tObject++) {
        double t = tObject-&gt;GetRadius(); //zum Testen, löst Fehler aus
        tObject-&gt;Draw(dc);
    }
}

//Erzeugt alle Objekte
void Window::CreatetObjects(double pRadius) {
    Vector speedVector(spinCtrl_SpeedProp-&gt;GetValue(), spinCtrl_SpeedProp-&gt;GetValue(), spinCtrl_SpeedProp-&gt;GetValue());
    Vector directionVector(0,0,0);
    Vector positionVector(0,0,0);

    for (int i = 0; i &lt;= spinCtrl_ObjectNumberProp-&gt;GetValue(); i++) {
        positionVector.Copy(RandomPosition(spinCtrl_RadiusProp-&gt;GetValue()));
        Object *tObject = new Object(positionVector, speedVector, directionVector, spinCtrl_SizeProp-&gt;GetValue(),
                      spinCtrl_RadiusProp-&gt;GetValue());
        objects.push_back(*tObject); //member der Klasse
    }
//Soll sie zufällig auf dem Bildschrim platzieren, ohne dass sie sich berühren
//Objekte sind (erstmal) Kreise
Vector Window::RandomPosition(double pRadius) {
    srand((unsigned) time(NULL));
    Vector tVector(rand()%(int)GetWidth() - pRadius, rand()%(int)GetHeight() - pRadius,0);
    std::list&lt;Object&gt;::const_iterator tObject = objects.begin();
    int loopCnt = 0;

    while(!objects.empty() &amp;&amp; tObject != objects.end() &amp;&amp; loopCnt &lt;= 50) {
//berechne Abstand mit CalcDistance
        if (CalcDistance(tVector, *tObject) &gt; fabs(pRadius - tObject-&gt;GetRadius()) &amp;&amp;
            CalcDistance(tVector, *tObject) &lt; fabs(pRadius + tObject-&gt;GetRadius())) {
                srand((unsigned) time(NULL));
                tVector.SetXKoord(rand()%(int)GetWidth());
                tVector.SetYKoord(rand()%(int)GetHeight());
                tObject = objectss.begin();
            }
        else tObject++;
        loopCnt++;
    }
    return tVector;
}
</code></pre>
<p>Die Funktionen werden in der Reihenfolge CreateObjects-&gt;RandomPosition-&gt;DrawScene aufgerufen. Bei letzerer bekomme ich beim Zugriff auf einzelne Funktionen von tObjecte &quot;Cannot access memory at address XXX&quot;</p>
<p>Muss ich die Liste vielleicht auf noch irgendwie initialisieren? Weil ich nur den standard Konstruktor der keine Parameter hat über den Klassenkonstruktor (von Window) aufrufe)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/224289/quot-cannot-access-memory-at-address-quot-fehler-bei-std-list</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 18:26:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224289.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Oct 2008 22:29:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Tue, 07 Oct 2008 22:29:32 GMT]]></title><description><![CDATA[<p>Hi,<br />
Ich hab ein Problem mit meiner std::list</p>
<pre><code class="language-cpp">//zeichnet alles mit wxWidgets
void Window::DrawScene(wxPaintEvent&amp; evt) {
    wxPaintDC dc(this);
    for (std::list&lt;Object&gt;::const_iterator tObject = obejcts.begin(); tObject != objects.end(); tObject++) {
        double t = tObject-&gt;GetRadius(); //zum Testen, löst Fehler aus
        tObject-&gt;Draw(dc);
    }
}

//Erzeugt alle Objekte
void Window::CreatetObjects(double pRadius) {
    Vector speedVector(spinCtrl_SpeedProp-&gt;GetValue(), spinCtrl_SpeedProp-&gt;GetValue(), spinCtrl_SpeedProp-&gt;GetValue());
    Vector directionVector(0,0,0);
    Vector positionVector(0,0,0);

    for (int i = 0; i &lt;= spinCtrl_ObjectNumberProp-&gt;GetValue(); i++) {
        positionVector.Copy(RandomPosition(spinCtrl_RadiusProp-&gt;GetValue()));
        Object *tObject = new Object(positionVector, speedVector, directionVector, spinCtrl_SizeProp-&gt;GetValue(),
                      spinCtrl_RadiusProp-&gt;GetValue());
        objects.push_back(*tObject); //member der Klasse
    }
//Soll sie zufällig auf dem Bildschrim platzieren, ohne dass sie sich berühren
//Objekte sind (erstmal) Kreise
Vector Window::RandomPosition(double pRadius) {
    srand((unsigned) time(NULL));
    Vector tVector(rand()%(int)GetWidth() - pRadius, rand()%(int)GetHeight() - pRadius,0);
    std::list&lt;Object&gt;::const_iterator tObject = objects.begin();
    int loopCnt = 0;

    while(!objects.empty() &amp;&amp; tObject != objects.end() &amp;&amp; loopCnt &lt;= 50) {
//berechne Abstand mit CalcDistance
        if (CalcDistance(tVector, *tObject) &gt; fabs(pRadius - tObject-&gt;GetRadius()) &amp;&amp;
            CalcDistance(tVector, *tObject) &lt; fabs(pRadius + tObject-&gt;GetRadius())) {
                srand((unsigned) time(NULL));
                tVector.SetXKoord(rand()%(int)GetWidth());
                tVector.SetYKoord(rand()%(int)GetHeight());
                tObject = objectss.begin();
            }
        else tObject++;
        loopCnt++;
    }
    return tVector;
}
</code></pre>
<p>Die Funktionen werden in der Reihenfolge CreateObjects-&gt;RandomPosition-&gt;DrawScene aufgerufen. Bei letzerer bekomme ich beim Zugriff auf einzelne Funktionen von tObjecte &quot;Cannot access memory at address XXX&quot;</p>
<p>Muss ich die Liste vielleicht auf noch irgendwie initialisieren? Weil ich nur den standard Konstruktor der keine Parameter hat über den Klassenkonstruktor (von Window) aufrufe)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595187</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Tue, 07 Oct 2008 22:29:32 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Wed, 08 Oct 2008 05:09:43 GMT]]></title><description><![CDATA[<p>Ich hab zwar jetzt grad keine Ahnung was ein object alles an Methoden hat, aber:</p>
<p>du erzeugst in Zeile 18/19 von deinem Code dynamisch Objects und packst Kopien davon in deine Liste (Zeile 20, push_back kopiert) danach geht der Zeiger auf das dynamisch erzeugte Objekt aus dem Scope, und du hast ein klassisches Spiecherleck. Was hindert dich daran, einfach statt des Poitners eine automatische Variable zu nutzen?<br />
also Zeile 18ff:</p>
<pre><code class="language-cpp">Object object(positionVector, speedVector, directionVector, spinCtrl_SizeProp-&gt;GetValue(), spinCtrl_RadiusProp-&gt;GetValue());
objects.push_back(object);
</code></pre>
<p>Ansonsten sind mri noch ein paar andere kleinigkeiten aufgefallen:<br />
- du benutzt in deinen for-schleifen ein Postinkrement. Generell sollte man sich angewöhnen Präinkrement zu nutzen wenns keinen genaueren grund für das Postinkrement gibt. Bei Klassen muss für das Postinkrement nämlich meist eine Kopie des Objektes angelegt werden, die nach dem erhöhen zurückgegeben wird. Das ist meist nicht nötig.<br />
- du benutzt zigmal srand() mit der aktuellen Zeit in Schleifen: am Ende in der while-Schleife, und RandomPosition wird ja auch in Schleifen aufgerufen. Wenn die Schleifen kurz sind (sind sie ja) werden sie so schnell durchlaufen dass time mehrmals den selben Wert liefert. Damit wird der Zufallsgenerator mehrmals mit dem selben Wert neu initialisiert und die rand()-Werte danach sind jedesmal die gleichen, bis time() einen anderen Wert liefert. Das ist sicher nicht das was du willst.<br />
- die while-Schleife am Ende ist eine verkappte for-schleife mit 2 Zählvariablen (der iterator und loopcnt), die könntest du also auch gut als solche kennzeichnen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595224</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 08 Oct 2008 05:09:43 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Wed, 08 Oct 2008 06:24:45 GMT]]></title><description><![CDATA[<p>Der Fehler liegt eindeutig nicht an der std::list. Das ist ein Fehler, den du bekommst, wenn du auf nicht vorhandenen Speicher zugreifst. Überprüf mal, was du ein der Liste hast, wo du das kreierst und wenn du etwas in der Liste zerstörtst auch wieder aus der Liste entfernst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595254</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 08 Oct 2008 06:24:45 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Wed, 08 Oct 2008 09:25:55 GMT]]></title><description><![CDATA[<p>Danke pumuckl für die Tipps ich werd den Code mal entsprechend aktualisieren.<br />
Leider brachte die Änderung in Zeile 18 keine Veränderung. Ich bin auch schon durch meine eigenen Klassen gegangen und hab geschaut ob irgendwo ein Copy-Konstruktor falsch gebaut ist oder Ähnliches, aber da sieht alles korrekt aus.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>: dass der Fehler nicht an der Liste selbst liegt ist mir klar, sondern dass es ehr an meiner unzureichenden Verwendung liegt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Die drei von mir beschriebenen Funktionen sind die einzigen drei Funktionen die bisher auf die Liste zugreifen, sprich ich zerstöre höchsten unwissentlich Objekte aus der Liste.</p>
<p>Edit: Diese Zeile am Ende der Create Funktion funktioniert:</p>
<pre><code class="language-cpp">void Window::CreatetObjects(double pRadius) {
    Vector speedVector(spinCtrl_SpeedProp-&gt;GetValue(), spinCtrl_SpeedProp-&gt;GetValue(), spinCtrl_SpeedProp-&gt;GetValue());
    Vector directionVector(0,0,0);
    Vector positionVector(0,0,0);

    for (int i = 0; i &lt;= spinCtrl_ObjectNumberProp-&gt;GetValue(); i++) {
        positionVector.Copy(RandomPosition(spinCtrl_RadiusProp-&gt;GetValue()));
        Object *tObject = new Object(positionVector, speedVector, directionVector, spinCtrl_SizeProp-&gt;GetValue(),
                      spinCtrl_RadiusProp-&gt;GetValue());
        objects.push_back(*tObject); //member der Klasse
    }
    for (std::list&lt;Object&gt;::const_iterator tObject = objects.begin(); tObject != objects.end(); ++tObject) {
        double t = tObject-&gt;GetRadius(); //liefert ohne Probleme korrekte Werte
    }
    }
</code></pre>
<p>Noch eine Frage: Muss man bei einem solchen Schleifendruchlauf (oder z.b. in der RandomPosition()) Funktion überprüfen ob die Liste leer ist oder reicht das so aus mit begin() / end() ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595334</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Wed, 08 Oct 2008 09:25:55 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Wed, 08 Oct 2008 10:35:24 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">(int i = 0; i &lt;= spinCtrl_ObjectNumberProp-&gt;GetValue(); i++)
</code></pre>
</blockquote>
<p>Dann würde ich mal hierauf tippen. Normalerweise sollte da lediglich ein &lt; - Operator sein. Weil in einer Liste oder was auch immer die Indices von 0 - Anzahl-1 gehen. Ist es ev. das?</p>
<p>EDIT:<br />
begin/end reicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595398</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 08 Oct 2008 10:35:24 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Wed, 08 Oct 2008 11:30:21 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (int i = 0; i &lt;= spinCtrl_ObjectNumberProp-&gt;GetValue(); i++) {
        positionVector.Copy(RandomPosition(spinCtrl_RadiusProp-&gt;GetValue()));
        Object *tObject = new Object(positionVector, speedVector, directionVector, spinCtrl_SizeProp-&gt;GetValue(),
                      spinCtrl_RadiusProp-&gt;GetValue());
        objects.push_back(*tObject); //member der Klasse
    }
</code></pre>
</blockquote>
<p>Du hast immer noch ein Speicherleck. Du erzeugst lokal (in Deiner Schleife mit <code>new</code> Object-Objekte auf dem Heap, und packst <em>Kopien</em> davon in die Liste. Es gibt nirgends ein <code>delete</code> , und Du hast auch keine Referenzen mehr auf Deine Heap-Objekte, so dass Du sie nicht mehr löschen kannst -&gt; Speicherleck.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595467</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 08 Oct 2008 11:30:21 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Wed, 08 Oct 2008 12:27:10 GMT]]></title><description><![CDATA[<p>Hmm..<br />
Also die aktuelle Version schaut so aus:</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; spinCtrl_ObjectNumberProp-&gt;GetValue(); ++i) {
        positionVector.Copy(RandomPosition(spinCtrl_RadiusProp-&gt;GetValue()));
        Object tObeject(positionVector, speedVector, directionVector, spinCtrl_SizeProp-&gt;GetValue());
        objects.push_back(tObject);
    }
</code></pre>
<p>Blick da gerade nicht durch wo ich dort ein Speicherleck haben soll. Die Objekte exestieren nur lokal und werden in die Liste kopiert -&gt; lokale Objekte werden sowieso automatisch zerstört; durch das Kopieren muss sich die Liste um alles kümmern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595508</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Wed, 08 Oct 2008 12:27:10 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Wed, 08 Oct 2008 12:42:31 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<p>Hmm..<br />
Also die aktuelle Version schaut so aus:</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; spinCtrl_ObjectNumberProp-&gt;GetValue(); ++i) {
        positionVector.Copy(RandomPosition(spinCtrl_RadiusProp-&gt;GetValue()));
        Object tObeject(positionVector, speedVector, directionVector, spinCtrl_SizeProp-&gt;GetValue());
        objects.push_back(tObject);
    }
</code></pre>
<p>Blick da gerade nicht durch wo ich dort ein Speicherleck haben soll. Die Objekte exestieren nur lokal und werden in die Liste kopiert -&gt; lokale Objekte werden sowieso automatisch zerstört; durch das Kopieren muss sich die Liste um alles kümmern.</p>
</blockquote>
<p>Diese Version hat das Problem auch nicht. Wie sieht es denn mit dem Copy-ctor von Object aus?<br />
Die Zugriffsverletzung muss ja nicht notwendig von einem ungültigen Iterator stammen, sondern könnte z.B. auch durch einen ungültigen Objektzustand verursacht werden. Soetwas findet man am Besten mit dem Debugger heraus (interne Objektvalidierung hilft auch).<br />
und ständiges</p>
<pre><code class="language-cpp">srand((unsigned) time(NULL));
</code></pre>
<p>wird keine Zufallswerte liefern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595514</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 08 Oct 2008 12:42:31 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Wed, 08 Oct 2008 13:24:19 GMT]]></title><description><![CDATA[<p>Über das srand((unsigned) time(NULL)) hatt pumuckl schon was geschrieben und ich habe das momentan so gelöst, dass ich loopCnt immer drauf addiere:</p>
<pre><code class="language-cpp">srand((unsigned) time(NULL) + loopCnt);
</code></pre>
<p>Also ich kann hier keinen Fehler entdecken... Was ich gerade anfange zu glauben, ist dass es vielleicht ein Problem mit wxWidgets sein kann. Weil genau diese Funktion nimmt er ohne Probleme an:</p>
<pre><code class="language-cpp">void Window::Test() {
    wxClientDC dc(this);
    for (std::list&lt;Object&gt;::const_iterator tObject = objects.begin(); tObject != objects.end(); ++tObeject) {
        tObject-&gt;Draw(dc);
    }
}
</code></pre>
<p>Und da ich diese Funktion genau an der selben stelle aufrufe wie die DrawScene() Methode kann der Copy- ctor auch nicht falsch sein. Es kann nur damit zusammenhängen, dass DrawScene() mit dem paint Event von wxWidgets verbunden ist. (Das ist jedenfalls der einzige Unterschied zwischen Test() und DrawScene())</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595544</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Wed, 08 Oct 2008 13:24:19 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Wed, 08 Oct 2008 14:56:03 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<p>Über das srand((unsigned) time(NULL)) hatt pumuckl schon was geschrieben und ich habe das momentan so gelöst, dass ich loopCnt immer drauf addiere:</p>
<pre><code class="language-cpp">srand((unsigned) time(NULL) + loopCnt);
</code></pre>
</blockquote>
<p>Wieso packst Du das nicht einfach in den Konstruktor Deiner Klasse? Es reicht, den Zufallsgenerator einmal zu initialisieren, um hinreichend zufällige Pseudozahlen zu generieren. Es ständig neu zu machen, ist absolut sinnlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595620</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 08 Oct 2008 14:56:03 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Cannot access memory at address&amp;quot; Fehler bei std::list on Wed, 08 Oct 2008 16:53:27 GMT]]></title><description><![CDATA[<p>Hmm eigentlich eine gute Frage und ich kann nur sagen keine Ahnung! War nicht sehr durchdacht von mir.<br />
Aber das Problem hat sich gelöst, es lag wie vermutet wirklich an wxWidgets. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595712</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Wed, 08 Oct 2008 16:53:27 GMT</pubDate></item></channel></rss>