<?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[Iterator &#x2F; Referenz... Verwirrt??]]></title><description><![CDATA[<p>EDIT: Der Code muss nicht zwangsweise korrekt sein, was seinen Zweck angeht. Ich habe ihn noch nicht getestet.</p>
<p>Hier eine Funktion zum Auflisten von Ordnern in einem Ordner.</p>
<pre><code class="language-cpp">void FilesAndDirs::ListDirectoriesInDirectory(const std::string&amp; Directory, std::vector &lt;std::string&gt;&amp; Directories, bool WithDirectory) {
    WIN32_FIND_DATA found;
    memset(&amp;found, 0, sizeof(found));
    RAII_Handle&lt;HANDLE, WINBASEAPI BOOL WINAPI (*)(HANDLE)&gt; fHandle (FindFirstFile((Directory + &quot;\\*&quot;).c_str(), &amp;found), &amp;FindClose);

    if (fHandle.get() == INVALID_HANDLE_VALUE)
        return;

    while (FindNextFile(fHandle.get(), &amp;found)) {
        if (std::string(found.cFileName) == &quot;..&quot;)
            continue;
        if ((found.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)) {
            if (WithDirectory)
                Directories.push_back(Directory + &quot;\\&quot; + std::string(found.cFileName)); // Hier wurf von eigenartigem Fehler
            else
                Directories.push_back(std::string(found.cFileName));
        }
    }
    //FindClose(fHandle.get()); automatisch
}
</code></pre>
<p>Und hier um alle Unterordner aufzulisten und jetzt kommt der Knackpunkt:</p>
<pre><code class="language-cpp">Directories.push_back(Directory);
    std::vector&lt;std::string&gt;::iterator iter = Directories.begin();
    do {
// nächste Zeile stand zuvor statt &quot;std::string(*iter)&quot; nur *iter
        ListDirectoriesInDirectory(std::string(*iter), Directories, true);
        ++iter;
    } while (iter != Directories.end());
</code></pre>
<p>Ich habe mit dem Debugger herausgefunden, dass in der markierten Zeile in der oberen Funktion der Fehler geworfen wird, aber dass dieser bei &quot;Directory&quot; lag, hat mich fast vom umgehauen.<br />
Nachdem ich eine Element zu dem vector hinzugefügt hatte (der erste Ordnerfund) scheint sich auch die Referenz &quot;Directory&quot; verändert zu haben und mir wurde der Zugriff auf ungültigem Speicherbereich angezeigt.</p>
<p>Danach habe ich die Änderung (mit Kommentar markiert in zweitem Code) gemacht und alles lief wieder.</p>
<p><strong>Darf sowas sein? Kann sowas sein?</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309925/iterator-referenz-verwirrt</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 00:18:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309925.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Oct 2012 18:50:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iterator &#x2F; Referenz... Verwirrt?? on Tue, 30 Oct 2012 18:59:14 GMT]]></title><description><![CDATA[<p>EDIT: Der Code muss nicht zwangsweise korrekt sein, was seinen Zweck angeht. Ich habe ihn noch nicht getestet.</p>
<p>Hier eine Funktion zum Auflisten von Ordnern in einem Ordner.</p>
<pre><code class="language-cpp">void FilesAndDirs::ListDirectoriesInDirectory(const std::string&amp; Directory, std::vector &lt;std::string&gt;&amp; Directories, bool WithDirectory) {
    WIN32_FIND_DATA found;
    memset(&amp;found, 0, sizeof(found));
    RAII_Handle&lt;HANDLE, WINBASEAPI BOOL WINAPI (*)(HANDLE)&gt; fHandle (FindFirstFile((Directory + &quot;\\*&quot;).c_str(), &amp;found), &amp;FindClose);

    if (fHandle.get() == INVALID_HANDLE_VALUE)
        return;

    while (FindNextFile(fHandle.get(), &amp;found)) {
        if (std::string(found.cFileName) == &quot;..&quot;)
            continue;
        if ((found.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)) {
            if (WithDirectory)
                Directories.push_back(Directory + &quot;\\&quot; + std::string(found.cFileName)); // Hier wurf von eigenartigem Fehler
            else
                Directories.push_back(std::string(found.cFileName));
        }
    }
    //FindClose(fHandle.get()); automatisch
}
</code></pre>
<p>Und hier um alle Unterordner aufzulisten und jetzt kommt der Knackpunkt:</p>
<pre><code class="language-cpp">Directories.push_back(Directory);
    std::vector&lt;std::string&gt;::iterator iter = Directories.begin();
    do {
// nächste Zeile stand zuvor statt &quot;std::string(*iter)&quot; nur *iter
        ListDirectoriesInDirectory(std::string(*iter), Directories, true);
        ++iter;
    } while (iter != Directories.end());
</code></pre>
<p>Ich habe mit dem Debugger herausgefunden, dass in der markierten Zeile in der oberen Funktion der Fehler geworfen wird, aber dass dieser bei &quot;Directory&quot; lag, hat mich fast vom umgehauen.<br />
Nachdem ich eine Element zu dem vector hinzugefügt hatte (der erste Ordnerfund) scheint sich auch die Referenz &quot;Directory&quot; verändert zu haben und mir wurde der Zugriff auf ungültigem Speicherbereich angezeigt.</p>
<p>Danach habe ich die Änderung (mit Kommentar markiert in zweitem Code) gemacht und alles lief wieder.</p>
<p><strong>Darf sowas sein? Kann sowas sein?</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265723</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Tue, 30 Oct 2012 18:59:14 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator &#x2F; Referenz... Verwirrt?? on Tue, 30 Oct 2012 19:01:02 GMT]]></title><description><![CDATA[<p>Tim06TR schrieb:</p>
<blockquote>
<p><strong>Darf sowas sein? Kann sowas sein?</strong></p>
</blockquote>
<p>Na klar, du hast schließlich eine Referenz auf ein Objekt, welches zwischenzeitlich zerstört wird. Undefiniertes Verhalten eben. Durch deine Änderung erzeugst du künstlich eine temporäre Kopie des referenzierten Objektes, dann geht's wieder.</p>
<p>Die eigentliche Fehlerursache ist aber, dass du hier Directories praktisch wie eine globale Variable benutzt<sup>*</sup>. Dadurch bekommst du undurchschaubare Abhängigkeiten, plötzliche unnachvollziehbare Änderungen und schwer zu findende Fehler. Das ist der Grund, warum uns die Altvorderen vor den globalen Variablen gewarnt haben.</p>
<p><sup>*</sup>: Ja, ich sehe, dass es wohl technisch ein Member von FilesAndDirs ist. Aber es wird benutzt wie eine globale Variable. Mach das FilesAndDirs:: vor dem Funktionsnamen weg und man könnte es nicht von einem globalen Programmzustand unterscheiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265727</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 30 Oct 2012 19:01:02 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator &#x2F; Referenz... Verwirrt?? on Tue, 30 Oct 2012 23:04:30 GMT]]></title><description><![CDATA[<p>Das wird noch skuriler...</p>
<pre><code class="language-cpp">void FilesAndDirs::EnumDirectories(const std::string&amp; Directory, std::vector &lt;std::string&gt;&amp; Directories)
{
    Directories.push_back(Directory);
    std::vector&lt;std::string&gt;::iterator iter = Directories.begin();
    do {
        ListDirectoriesInDirectory(std::string(*iter), Directories, true);
        for (int i = 0; i &lt; Directories.size(); ++i) {
            std::cout &lt;&lt; &quot;_&quot; &lt;&lt; Directories[i];   // richtige Ausgabe
            std::cin.get();
        }
        ++iter;
        std::cout &lt;&lt; Directories.size() &lt;&lt; std::endl;    // Ausgabe 3 (richtig)
        std::cout &lt;&lt; &quot;-&gt;|&quot; &lt;&lt; *iter &lt;&lt; &quot;|&quot; &lt;&lt; std::endl; // leerer String???
    } while (iter != Directories.end()); // Bedingung ist false
}
</code></pre>
<p>Was ist denn hier mit dem Iterator kaputt?</p>
<p>EDIT: Ohne Verwendung von Iteratoren, Also:</p>
<pre><code class="language-cpp">void FilesAndDirs::EnumDirectories(const std::string&amp; Directory, std::vector &lt;std::string&gt;&amp; Directories)
{
    Directories.push_back(Directory);
    unsigned int i = 0;
    do {
        ListDirectoriesInDirectory(std::string(Directories[i]), Directories, true);
        ++i;
    } while (i != Directories.size());
}
</code></pre>
<p>läuft alles planmäßig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265789</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Tue, 30 Oct 2012 23:04:30 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator &#x2F; Referenz... Verwirrt?? on Tue, 30 Oct 2012 23:16:44 GMT]]></title><description><![CDATA[<p>Sofern du den Fehler nicht verbessert hast, ist immer noch das gleiche kaputt. Durch das push_back in ListDirectoriesInDirectory werden alle Iteratoren ungültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265793</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 30 Oct 2012 23:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator &#x2F; Referenz... Verwirrt?? on Tue, 30 Oct 2012 23:28:44 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Sofern du den Fehler nicht verbessert hast, ist immer noch das gleiche kaputt. Durch das push_back in ListDirectoriesInDirectory werden alle Iteratoren ungültig.</p>
</blockquote>
<p>Danke, der Wortlauft war wichtig. Jetzt habe ich es verstanden!</p>
<p>EDIT: Irgendwie ungünstig... -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265794</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Tue, 30 Oct 2012 23:28:44 GMT</pubDate></item></channel></rss>