<?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[[gelöst] Programm throws BAD_ALLOC]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab ein Problem mit einem Programm, das ich hier an der Uni schreibe. Das Programm berechnet im wesentlichen für vorgegebene Knoten und Technologien(zB. LTE) die besten Positionen um Sender zu positionieren und damit die größtmögliche Abdeckung zu erreichen.</p>
<p>Aktuell geht das Programm so vor, dass zunächst für jeden Knoten die Verbindungskosten zu allen anderen Knoten berechnet werden und die Ergebnisse in einem Vector gespeichert werden (Werden sehr große Objekte). Anschließend wird der beste Knoten ausgewählt und soll aus dem Vector entfernt werden, sodass der 2. beste Knoten gesucht werden kann usw.<br />
Das Programm macht noch einige andere Sachen, aber die sollten hier nicht wichtig sein. Bis vor kurzem lief das Programm auch einwandfrei. Nach den letzten Änderungen (waren etwas umfangreicher), die allerdings nicht die Stelle betreffen an der der Fehler auftritt, wird bei einer bestimmten Anzahl an Knoten ein BAD_ALLOC geworfen, wenn ein Element von dem Vector entfernt werden soll.</p>
<p>Ich versuche mal das ganze in einem kleinen Codebeispiel zu rekonstruieren:</p>
<pre><code class="language-cli">vector&lt;Knoten&gt; myFun (vector&lt;Knoten&gt; &amp;inputNodes)
{
vector&lt;Knoten&gt; ergebnisVector = bewerteKnoten(inputNodes);
/*Hier kommt ein vector zurück, der zu jedem Knoten die verbindungskosten zu allen anderen Knoten, ebenfalls in einem vector enthält*/

//[Finde beste Knoten Algorithmus]

//Entfernen des besten Knoten
vector&lt;Knoten&gt;::iterator it;
for (it = ergebnisVector-&gt;begin(); it &lt; ergebnisVector-&gt;end(); ++it)
{
    //ich muss den hier neu suchen, da der Vector umsortiert wurde
    if (it-&gt;myid == bestNode.myid)
    {
        it = ergebnisVector-&gt;erase(it); //FIXME: throws bad_alloc
	break;
    }
}
//die besten Knoten werden noch in einen Ergebnisvecotr gepackt und zurückgegeben
}
</code></pre>
<p>Ich hab auch schon nach BAD_ALLOC gegoogelt, allerdings bin ich da immer nur auf Speicherengpässe gestoßen. Das kann hier natürlich auch der Fall sein, allerdings tritt der Fehler nicht bei jeder Anzahl von Eingabe Knoten auf:<br />
Er ist zB. bei 34000 Knoten (Dafür soll das Programm mal laufen) aufgetreten, bei 3400 Knoten nicht und dann war er bei 340 und 100 Knoten wieder da.<br />
Deshalb kam mir das mit dem Speicher ein wenig komisch vor.</p>
<p>Hat da irgendjemand eine Idee wo das Problem liegen könnte?</p>
<p>Ich hab bereits versucht, statt eines Vectors eine Liste zu benutzen, allerdings hatte ich dabei das gleiche Problem, also wieder den BAD_ALLOC</p>
<p>Schon mal vorab danke für legliche Hilfe.</p>
<p>Gruß<br />
cni</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306083/gelöst-programm-throws-bad_alloc</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 10:05:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306083.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Jul 2012 13:54:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Fri, 20 Jul 2012 12:33:43 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab ein Problem mit einem Programm, das ich hier an der Uni schreibe. Das Programm berechnet im wesentlichen für vorgegebene Knoten und Technologien(zB. LTE) die besten Positionen um Sender zu positionieren und damit die größtmögliche Abdeckung zu erreichen.</p>
<p>Aktuell geht das Programm so vor, dass zunächst für jeden Knoten die Verbindungskosten zu allen anderen Knoten berechnet werden und die Ergebnisse in einem Vector gespeichert werden (Werden sehr große Objekte). Anschließend wird der beste Knoten ausgewählt und soll aus dem Vector entfernt werden, sodass der 2. beste Knoten gesucht werden kann usw.<br />
Das Programm macht noch einige andere Sachen, aber die sollten hier nicht wichtig sein. Bis vor kurzem lief das Programm auch einwandfrei. Nach den letzten Änderungen (waren etwas umfangreicher), die allerdings nicht die Stelle betreffen an der der Fehler auftritt, wird bei einer bestimmten Anzahl an Knoten ein BAD_ALLOC geworfen, wenn ein Element von dem Vector entfernt werden soll.</p>
<p>Ich versuche mal das ganze in einem kleinen Codebeispiel zu rekonstruieren:</p>
<pre><code class="language-cli">vector&lt;Knoten&gt; myFun (vector&lt;Knoten&gt; &amp;inputNodes)
{
vector&lt;Knoten&gt; ergebnisVector = bewerteKnoten(inputNodes);
/*Hier kommt ein vector zurück, der zu jedem Knoten die verbindungskosten zu allen anderen Knoten, ebenfalls in einem vector enthält*/

//[Finde beste Knoten Algorithmus]

//Entfernen des besten Knoten
vector&lt;Knoten&gt;::iterator it;
for (it = ergebnisVector-&gt;begin(); it &lt; ergebnisVector-&gt;end(); ++it)
{
    //ich muss den hier neu suchen, da der Vector umsortiert wurde
    if (it-&gt;myid == bestNode.myid)
    {
        it = ergebnisVector-&gt;erase(it); //FIXME: throws bad_alloc
	break;
    }
}
//die besten Knoten werden noch in einen Ergebnisvecotr gepackt und zurückgegeben
}
</code></pre>
<p>Ich hab auch schon nach BAD_ALLOC gegoogelt, allerdings bin ich da immer nur auf Speicherengpässe gestoßen. Das kann hier natürlich auch der Fall sein, allerdings tritt der Fehler nicht bei jeder Anzahl von Eingabe Knoten auf:<br />
Er ist zB. bei 34000 Knoten (Dafür soll das Programm mal laufen) aufgetreten, bei 3400 Knoten nicht und dann war er bei 340 und 100 Knoten wieder da.<br />
Deshalb kam mir das mit dem Speicher ein wenig komisch vor.</p>
<p>Hat da irgendjemand eine Idee wo das Problem liegen könnte?</p>
<p>Ich hab bereits versucht, statt eines Vectors eine Liste zu benutzen, allerdings hatte ich dabei das gleiche Problem, also wieder den BAD_ALLOC</p>
<p>Schon mal vorab danke für legliche Hilfe.</p>
<p>Gruß<br />
cni</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233509</guid><dc:creator><![CDATA[cni]]></dc:creator><pubDate>Fri, 20 Jul 2012 12:33:43 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Tue, 17 Jul 2012 14:08:13 GMT]]></title><description><![CDATA[<p>Jepp. bad_alloc --&gt; Speicherengpass, das stimmt schon. Vielleicht haste ja irgendwo ein leck und/oder Fragmentierung.</p>
<p>Zeig doch mal die Definition von Knoten.</p>
<p>Und falls myFun den Eingabevektor gar nicht verändern will, sollte sie das auch entsprechend kennzeichnen mit einem const; denn immerhin verlangst du einen Zeiger:</p>
<pre><code class="language-cpp">vector&lt;Knoten&gt; myFun (vector&lt;Knoten&gt; const* inputNodes)
</code></pre>
<p>wobei man dann natürlich auch gleich eine Referenz statt eines Zeigers verwenden kann:</p>
<pre><code class="language-cpp">vector&lt;Knoten&gt; myFun (vector&lt;Knoten&gt; const&amp; inputNodes)
</code></pre>
<p>Dann könntest du sogar temporäre Objekte in die Funktion stecken. Auf solchen Dingern funktioniert ja im Allgemeinen der Adressoperator nicht.</p>
<p>Falls dir die Reihenfolge der Knoten-Objekte im Vektor nicht wichtig ist, könntest du das &quot;Aufrücken&quot; im Vektor beim Löschen eines einzelnen Elements auch sparen. Du kopierst dazu einfach den letzten Knoten auf das zu löschende Element und reduzierst die Vektorgröße um eins.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233514</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 17 Jul 2012 14:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Tue, 17 Jul 2012 14:12:52 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Jepp. bad_alloc --&gt; Speicherengpass, das stimmt schon.</p>
</blockquote>
<p>Ist aber nicht die einzig mögliche Ursache. Wenn nicht grade tonnenweise Speicher angefordert wird und nie wieder freigegeben wird (d.h. wenn man sich nicht extrem viel Mühe gibt den Engpass zu erzeugen), ist es wahrscheinlicher dass der Heap irgendwo zerschossen wird.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28881">@cni</a>: Versuch mal den Code komplett, kompilierbar, reduziert zu posten - mit Problem (siehe Link in meiner Signatur)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233516</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 17 Jul 2012 14:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Tue, 17 Jul 2012 14:33:48 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Versuch mal den Code komplett, kompilierbar, reduziert zu posten</p>
</blockquote>
<p>ja das mit dem Code posten ist so ne Sache, da das ne ganze Menge Code ist und der Fehler ja nicht mal bei mir bei jeder Ausführung auftritt (Verschieden viele Eingangsknoten)</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>ist es wahrscheinlicher dass der Heap irgendwo zerschossen wird.</p>
</blockquote>
<p>Kann ich das irgendwie nachvollziehen (Debuggen oder so)? Wenn ich durch den Code debugge fliegt er halt wirklich erst an der besagten Stelle raus. Ich nutze eclipse unter linux.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Zeig doch mal die Definition von Knoten.</p>
</blockquote>
<pre><code class="language-cli">class Knoten {
public:
   std::vector&lt; std::pair&lt;double, unsigned int&gt; &gt; suppliedNodes;
   double threshold;
   int type;
   std::vector&lt;unsigned int&gt; doubleSuppliedNodes;
};
</code></pre>
<p>Mir ist bewusst, dass einzelne Objekte und gerade ein Vector&lt;Knoten&gt; sehr groß wird, allerdings klappt es mit zB. 3400 Eingangsknoten und mit 340 nicht. Die Größe sollte hier also kein Problem sein.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>wobei man dann natürlich auch gleich eine Referenz statt eines Zeigers verwenden kann:<br />
Dann könntest du sogar temporäre Objekte in die Funktion stecken. Auf solchen Dingern funktioniert ja im Allgemeinen der Adressoperator nicht.</p>
</blockquote>
<p>Mach ich sogar, hab mich da vertippt.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Falls dir die Reihenfolge der Knoten-Objekte im Vektor nicht wichtig ist, könntest du das &quot;Aufrücken&quot; im Vektor beim Löschen eines einzelnen Elements auch sparen. Du kopierst dazu einfach den letzten Knoten auf das zu löschende Element und reduzierst die Vektorgröße um eins.</p>
</blockquote>
<p>Werd das mal ausprobieren und morgen das Ergebnis posten.</p>
<p>Danke schon mal<br />
cni</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233523</guid><dc:creator><![CDATA[cni]]></dc:creator><pubDate>Tue, 17 Jul 2012 14:33:48 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Tue, 17 Jul 2012 14:45:39 GMT]]></title><description><![CDATA[<p>cni schrieb:</p>
<blockquote>
<p>und der Fehler ja nicht mal bei mir bei jeder Ausführung auftritt (Verschieden viele Eingangsknoten)</p>
</blockquote>
<p>Tritts denn wenigstens bei gleichbleibenden Eingaben zuverlässig auf? Dann solltest du das Problem natürlich immer mit dem selben Eingabesatz nachstellen und eingrenzen (und den Code reduzieren).</p>
<p>Zusätzlich wäre ggf. eine Analyse der Eingabesätze zielführend, die den Fehler triggern, vielleicht gibts da Gemeinsamkeiten die dich auf den Fehler stoßen.</p>
<p>Wenn der Fehler nicht immer auftritt (bei gleichen Eingaben), dann hört sich das nach nichtdeterministischem Verhalten an, was typischerweise bei parallelen Programmen auftaucht, die eine Race Condition oder ähnliches beinhalten.</p>
<blockquote>
<p>Kann ich das irgendwie nachvollziehen (Debuggen oder so)?</p>
</blockquote>
<p>Debugger und/oder Profiler können sowas oft bemerken. Die Ursachen liegen leider oft an Stellen, die nichts mit dem Code zu tun haben, in dem das Problem auftritt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233528</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 17 Jul 2012 14:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Tue, 17 Jul 2012 15:06:18 GMT]]></title><description><![CDATA[<p>Ein Debugger kann dir wenigstens ganz leicht die unmittelbare Ursache nennen (vielleicht ist die angeforderte Größe fälschlicherweise sehr groß oder gar negativ). Ein Speicherdebugger wie valgrind kann dir auch Ursachen automatisch finden, die auf (technisch) fehlerhafte Programmierung zurückzuführen sind. Ein guter Compiler mit hohem Warnlevel kann dir viele solcher Fehler auch schon bei der Übersetzung des Programms finden, falls du dies noch nicht getan hast (Warnungen sollten immer angeschaltet sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233531</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 17 Jul 2012 15:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Wed, 18 Jul 2012 09:58:11 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Die Ursachen liegen leider oft an Stellen, die nichts mit dem Code zu tun haben, in dem das Problem auftritt.</p>
</blockquote>
<p>Hattest recht. Hab mir in dem Teil, den ich hier als &quot;[Finde beste Knoten Algorithmus]&quot; abgetan hab, den Heap zerschossen. Hab das Programm mal mit valgrind (Danke an SeppJ) durchlaufen lassen und damit das Problem finden und beheben können.<br />
Außerdem konnte ich noch einige andere Fehler bei der Speicherallokierung beheben. <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="👍"
    /></p>
<p>Vielen Dank für die Hilfe.<br />
Gruß cni</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233693</guid><dc:creator><![CDATA[cni]]></dc:creator><pubDate>Wed, 18 Jul 2012 09:58:11 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Wed, 18 Jul 2012 10:26:57 GMT]]></title><description><![CDATA[<p>Wenn du die Standardcontainer gern und häufig einsetzt, dann kannst du auch mal deren <a href="http://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html" rel="nofollow">Debug-Modus</a> einschalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233696</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 18 Jul 2012 10:26:57 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Thu, 19 Jul 2012 13:37:06 GMT]]></title><description><![CDATA[<p>Hallo noch mal,</p>
<p>dank eurer Hilfe konnte ich den ursprünglichen Fehler beheben und das Programm läuft soweit. Allerdings hab ich jetzt ein neues Problem. Wenn ich das Programm mit der Eingabemenge von ca. 34000 Knoten, für die es vorgesehen ist, im Terminal starte kommt nach 25min erneut ein BAD_ALLOC.<br />
Wenn ich das Programm ohne Änderungen mit den gleichen Eingabedaten in eclipse starte, läuft es ohne Probleme durch.<br />
Kann der Fehler in diesem Fall tatsächlich durch ein Speicherproblem entstehen?</p>
<p>Bei Eingabeparametern mit weniger Knoten läuft es sowohl im Terminal als auch in eclipse.</p>
<p>Ich werde jetzt erst mal versuchen das Programm für den list container umzuschreiben. Könnt ihr mir sagen ob das was bringen könnte (Nur bezogen auf Speichereffizienz)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234106</guid><dc:creator><![CDATA[cni]]></dc:creator><pubDate>Thu, 19 Jul 2012 13:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Thu, 19 Jul 2012 13:42:01 GMT]]></title><description><![CDATA[<p>cni schrieb:</p>
<blockquote>
<p>Kann der Fehler in diesem Fall tatsächlich durch ein Speicherproblem entstehen?</p>
</blockquote>
<p>Ja. Das klingt sehr nach irgendeinem undefinierten Verhalten und in deiner entwicklungsumgebung läuft das Programm in irgendeiner dummen Debuglaufzeitumgebung, die den Fehler verschleppt, anstatt darauf aufmerksam zu machen.</p>
<blockquote>
<p>Ich werde jetzt erst mal versuchen das Programm für den list container umzuschreiben. Könnt ihr mir sagen ob das was bringen könnte (Nur bezogen auf Speichereffizienz)?</p>
</blockquote>
<p>Ganz bestimmt nicht. Die Worte &quot;list&quot; und &quot;Effizienz&quot; gehören nicht in den gleichen Satz, außer, es kommt noch ein &quot;nicht&quot; darin vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234113</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 19 Jul 2012 13:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Thu, 19 Jul 2012 13:56:25 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ganz bestimmt nicht. Die Worte &quot;list&quot; und &quot;Effizienz&quot; gehören nicht in den gleichen Satz, außer, es kommt noch ein &quot;nicht&quot; darin vor.</p>
</blockquote>
<p>Ok dann werd ich das wohl nicht mehr weitermachen <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 guck dann einfach noch mal ob ich mit valgrind oder dem Debug Modus standard container was finde.</p>
<p>Danke schon mal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234119</guid><dc:creator><![CDATA[cni]]></dc:creator><pubDate>Thu, 19 Jul 2012 13:56:25 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Thu, 19 Jul 2012 14:14:20 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ganz bestimmt nicht. Die Worte &quot;list&quot; und &quot;Effizienz&quot; gehören nicht in den gleichen Satz, außer, es kommt noch ein &quot;nicht&quot; darin vor.</p>
</blockquote>
<p>Ich würde es gerne etwas anders formulieren. Wer viele Objekte haben möchte (und mit viel meine ich Mengen, die an das Limit des verfügbaren RAMs kommen), der wird mit std::list/std::forward_list möglicherweise mehr Objekte abspeichern können als mit std::vector, da der Speicher nicht am Stück liegen muss. Das ist natürlich nur der Fall, solange der gespeicherte Typ ebenfalls am Stück liegt.</p>
<p>Grundsätzlich hast du aber vollkommen Recht, list ist einfach nur lahm, verbraucht viel Extraspeicher für Pointer und ist Cache-unfreundlich.</p>
<p>Edit: Um meinen Punkt etwas klarer zu machen: Es kommt darauf an, wie man Effizienz definiert.</p>
<p>Effizienz =<br />
- Höhere Geschwindigkeit (natürlich auch von Operationen abhängig) -&gt; std::vector<br />
- Geringerer Overhead -&gt; std::vector<br />
- Mögliche Speicherausnutzung -&gt; Stark abhängig vom Usecase.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234122</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 19 Jul 2012 14:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Thu, 19 Jul 2012 15:16:36 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Ganz bestimmt nicht. Die Worte &quot;list&quot; und &quot;Effizienz&quot; gehören nicht in den gleichen Satz, außer, es kommt noch ein &quot;nicht&quot; darin vor.</p>
</blockquote>
<p>Ich würde es gerne etwas anders formulieren. Wer viele Objekte haben möchte (und mit viel meine ich Mengen, die an das Limit des verfügbaren RAMs kommen), der wird mit std::list/std::forward_list möglicherweise mehr Objekte abspeichern können als mit std::vector, da der Speicher nicht am Stück liegen muss. Das ist natürlich nur der Fall, solange der gespeicherte Typ ebenfalls am Stück liegt.</p>
</blockquote>
<p>Das klingt eher nach einem Fall für eine deque.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234145</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 19 Jul 2012 15:16:36 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Fri, 20 Jul 2012 08:30:03 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Kellerautomat schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Ganz bestimmt nicht. Die Worte &quot;list&quot; und &quot;Effizienz&quot; gehören nicht in den gleichen Satz, außer, es kommt noch ein &quot;nicht&quot; darin vor.</p>
</blockquote>
<p>Ich würde es gerne etwas anders formulieren. Wer viele Objekte haben möchte (und mit viel meine ich Mengen, die an das Limit des verfügbaren RAMs kommen), der wird mit std::list/std::forward_list möglicherweise mehr Objekte abspeichern können als mit std::vector, da der Speicher nicht am Stück liegen muss. Das ist natürlich nur der Fall, solange der gespeicherte Typ ebenfalls am Stück liegt.</p>
</blockquote>
<p>Das klingt eher nach einem Fall für eine deque.</p>
</blockquote>
<p>Macht es denn dann Sinn eine deque (oder list) zu benutzen statt eines vectors, wenn das Problem wirklich auf zu wenig verfügbarem Speicher beruht?</p>
<p>Es kann natürlich gut sein, dass da noch einige andere Fehler in meinem Programm sind. Allerdings dauert es jedes mal ne gute halbe Stunde bis der Fehler auftritt. Da ist das Debuggen relativ zeitaufwendig.<br />
Bei der Verwendung von valgrind dauert es dann wahrscheinlich einige Stunden bis der Fehler auftritt...<br />
Gibts da ne schnellere Möglichkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234281</guid><dc:creator><![CDATA[cni]]></dc:creator><pubDate>Fri, 20 Jul 2012 08:30:03 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Fri, 20 Jul 2012 08:43:58 GMT]]></title><description><![CDATA[<p>cni schrieb:</p>
<blockquote>
<p>Macht es denn dann Sinn eine deque (oder list) zu benutzen statt eines vectors, wenn das Problem wirklich auf zu wenig verfügbarem Speicher beruht?</p>
</blockquote>
<p>Nur wenn es wirklich an zu wenig Speicher liegt, was extrem unwahrscheinlich ist.</p>
<blockquote>
<p>Es kann natürlich gut sein, dass da noch einige andere Fehler in meinem Programm sind.</p>
</blockquote>
<p>Dies wird vermutlich der Fall sein.</p>
<blockquote>
<p>Allerdings dauert es jedes mal ne gute halbe Stunde bis der Fehler auftritt. Da ist das Debuggen relativ zeitaufwendig.</p>
</blockquote>
<p>Lass dir doch einfach mal ein Coredump machen, dann siehst du wenigstens die unmittelbare Ursache. Vielleicht läuft irgendwo etwas über und du forderst eine negative Menge Speicher an oder ähnliches.</p>
<blockquote>
<p>Bei der Verwendung von valgrind dauert es dann wahrscheinlich einige Stunden bis der Fehler auftritt...</p>
</blockquote>
<p>Einfach mal valgrind in den strengsten Einstellungen auf eine kleinere Datenmenge ansetzen, vielleicht ist der Fehler schon da, aber wirkt noch nicht fatal. Ich benutze für valgrind immer</p>
<pre><code>valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./executable
</code></pre>
<p>und im Falle von uninitialisierten Werten noch zusätzlich <code>--track-origins=yes</code> . Letzteres ist wirklich sehr langsam, daher nur, wenn die anderen Checks schon was werfen, um die Ursache zu finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234285</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 20 Jul 2012 08:43:58 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Fri, 20 Jul 2012 10:08:12 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ich benutze für valgrind immer</p>
<pre><code>valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./executable
</code></pre>
<p>und im Falle von uninitialisierten Werten noch zusätzlich <code>--track-origins=yes</code> . Letzteres ist wirklich sehr langsam, daher nur, wenn die anderen Checks schon was werfen, um die Ursache zu finden.</p>
</blockquote>
<p>Hab das jetzt gerade mit den Parametern laufen lassen. &quot;Leider&quot; sind keine Fehler aufgetreten und der Durchgang hat auch mal eben ne knappe Stunde gedauert.</p>
<p>Werd das jetzt mal mit der deque probieren, schaden kanns ja nicht <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="😉"
    /> ist auch nicht so viel Aufwand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234316</guid><dc:creator><![CDATA[cni]]></dc:creator><pubDate>Fri, 20 Jul 2012 10:08:12 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Fri, 20 Jul 2012 10:13:10 GMT]]></title><description><![CDATA[<p>Erwarte keine Wunder von deque. Wenn vector bei Eingabemenge 34000 an zu wenig zusammenhängendem Speicher scheitert, dann wird deque auch nicht wesentlich weiter kommen. Ist dein Programm denn wirklich so speicherintensiv, dass dein Rechner voll ausgenutzt wird? Und ist dies für den Algorithmus wirklich nötig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2234320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234320</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 20 Jul 2012 10:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Programm throws BAD_ALLOC on Fri, 20 Jul 2012 10:35:02 GMT]]></title><description><![CDATA[<p>Das Problem bei der ganzen Sache ist, dass der Algorithmus schon länger existiert und mit der Zeit einfach immer erweitert wurde. Wahrscheinlich gibt es schon einen Weg das ganze effizienter zu Programmieren, allerdings müsste man dann auch komplett neu Anfangen.<br />
Also bei dem letzten Versuch ist der Algorithmus komplett durch gelaufen (mit deque). Hoffe mal das war jetzt kein Zufall...</p>
<p>Da ich dem ganzen Programm allerdings auch nicht mehr so viel Zeit widmen wollte, werd ich dem Problem nicht mehr genauer auf den Grund gehen, wenn es denn dann jetzt läuft.<br />
Von da her schon mal vielen Dank für die Hilfe an alle! <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/2234325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2234325</guid><dc:creator><![CDATA[cni]]></dc:creator><pubDate>Fri, 20 Jul 2012 10:35:02 GMT</pubDate></item></channel></rss>