<?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[Speicherzugriffsfehler nach Update von GCC]]></title><description><![CDATA[<p>Hallo allerseits.</p>
<p>Ich muss auf Arbeit ab und an mal programmieren und nutze ein externes Paket, welches noch in der Entwicklung ist und mir irgendetwas berechnen soll. Das hat immer ganz gut geklappt aber nach dem letzten Update meines Rechners bricht das Programm mit einem Speicherzurgiffsfehler im externen Code ab. Glücklicherweise habe ich den SourceCode davon. Mir ist es jetzt leider noch nicht gelungen ein Minimalbeispiel zu basteln, welches den Fehler erzeugt, aber ich schicke vielleicht mal die entsprechenden Code-Schnipsel.</p>
<p>Irgendwo in einem Header wird das definiert:</p>
<pre><code>#define SizeOfInt      ((long) 4)
</code></pre>
<p>Dann wird folgender Code ausgeführt:</p>
<pre><code>KVEL = new int[N_Vertices];

  memset(KVEL, 0, N_Vertices * SizeOfInt);

  // Hier wird jetzt irgendwas berechnet

  delete KVEL;
</code></pre>
<p>Der Fehler kommt beim Delete und ich verstehe einfach nicht warum.</p>
<pre><code>malloc(): memory corruption: 0x0000000003796f20
</code></pre>
<p>Ich weiß, dass man bei dynamischer Speicherallokierung mit new int[] auch mit delete[] löschen sollte, aber das ist im Gesamten Softwarepaket so gemacht. Valgrind hört mit Meckern gar nicht mehr auf aber ich wollte diese Fehler nicht beheben.</p>
<p>Skeptisch macht mich, dass SizeOfInt auf 4 gesetzt wird. Hängt das nicht von der Rechnerarchitektur ab?</p>
<p>Hat jemand eine Ahnung was da los ist?<br />
Ich komm irgendwie nicht drauf. Auf meinem Arbeitsrechner läuft das alles ohne Probleme durch.</p>
<p>Falls es hilft, noch meine GCC-Version:</p>
<pre><code>g++ --version
g++ (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]
</code></pre>
<p>Danke schonmal für die Hilfe.</p>
<p>Grüße<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321841/speicherzugriffsfehler-nach-update-von-gcc</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 21:47:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321841.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Nov 2013 21:45:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherzugriffsfehler nach Update von GCC on Mon, 25 Nov 2013 21:45:17 GMT]]></title><description><![CDATA[<p>Hallo allerseits.</p>
<p>Ich muss auf Arbeit ab und an mal programmieren und nutze ein externes Paket, welches noch in der Entwicklung ist und mir irgendetwas berechnen soll. Das hat immer ganz gut geklappt aber nach dem letzten Update meines Rechners bricht das Programm mit einem Speicherzurgiffsfehler im externen Code ab. Glücklicherweise habe ich den SourceCode davon. Mir ist es jetzt leider noch nicht gelungen ein Minimalbeispiel zu basteln, welches den Fehler erzeugt, aber ich schicke vielleicht mal die entsprechenden Code-Schnipsel.</p>
<p>Irgendwo in einem Header wird das definiert:</p>
<pre><code>#define SizeOfInt      ((long) 4)
</code></pre>
<p>Dann wird folgender Code ausgeführt:</p>
<pre><code>KVEL = new int[N_Vertices];

  memset(KVEL, 0, N_Vertices * SizeOfInt);

  // Hier wird jetzt irgendwas berechnet

  delete KVEL;
</code></pre>
<p>Der Fehler kommt beim Delete und ich verstehe einfach nicht warum.</p>
<pre><code>malloc(): memory corruption: 0x0000000003796f20
</code></pre>
<p>Ich weiß, dass man bei dynamischer Speicherallokierung mit new int[] auch mit delete[] löschen sollte, aber das ist im Gesamten Softwarepaket so gemacht. Valgrind hört mit Meckern gar nicht mehr auf aber ich wollte diese Fehler nicht beheben.</p>
<p>Skeptisch macht mich, dass SizeOfInt auf 4 gesetzt wird. Hängt das nicht von der Rechnerarchitektur ab?</p>
<p>Hat jemand eine Ahnung was da los ist?<br />
Ich komm irgendwie nicht drauf. Auf meinem Arbeitsrechner läuft das alles ohne Probleme durch.</p>
<p>Falls es hilft, noch meine GCC-Version:</p>
<pre><code>g++ --version
g++ (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]
</code></pre>
<p>Danke schonmal für die Hilfe.</p>
<p>Grüße<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367982</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Mon, 25 Nov 2013 21:45:17 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler nach Update von GCC on Mon, 25 Nov 2013 21:55:36 GMT]]></title><description><![CDATA[<p>Versuchs mal mit</p>
<pre><code>delete[] KVEL;
</code></pre>
<p>*Edit<br />
Ausserdem ist das mit dem SizeOfInt <s>ziemlich merkwürdig</s> kompletter Schwachsinn (und schon gar nicht portablel). Wer hat diesen Code geschrieben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367983</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 25 Nov 2013 21:55:36 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler nach Update von GCC on Mon, 25 Nov 2013 21:51:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#define SizeOfInt      ((long) 4)
</code></pre>
<p>lol?</p>
<pre><code class="language-cpp">define SizeOfInt (sizeof int)
</code></pre>
<p>Aber wozu überhaupt C++?</p>
<pre><code class="language-cpp">KVEL = malloc(N_Vertices * sizeof(*KVEL)); 
memset(KVEL, 0, N_Vertices * SizeOfInt);

  // Hier wird jetzt irgendwas berechnet

free(KVEL);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2367984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367984</guid><dc:creator><![CDATA[mr. lol]]></dc:creator><pubDate>Mon, 25 Nov 2013 21:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler nach Update von GCC on Mon, 25 Nov 2013 22:07:02 GMT]]></title><description><![CDATA[<p>Ich hab mal das delete[] versucht, danach kam das Program schon etwas weiter. Dann hab ich es wieder auf delete geändert und er kommt immernoch weiter als ich oben beschrieben habe. Es ist zu Haare raufen.</p>
<p>Jetzt ist das Problem folgendes:</p>
<pre><code>KMT = new TJoint*[N_RootCells*4];   // Beim Debuggen war RootCells=8
memset(KMT, 0, N_RootCells*4 * SizeOfInt);

// hier wird mal wieder gerechnet und ab und an kommt ein 

KMT[i*4 + j] = new TJoint(...);

// Allerdings werden nicht alle Elemente in KMT belegt und irgendwann fragt er mal

Joint = KMT[Neib*4 + k];
if (Joint)
{
   Joint.Methode(...);
}
</code></pre>
<p>Jetzt das Problem:<br />
Er will abfragen ob Joint==NULL ist.<br />
Einige Elemente in KMT haben sinnvolle Werte und Joint.Methode(...) tut was es tun soll. Bei denen die NULL sind wird das Ganze übersprungen.</p>
<p>Direkt nach dem Malloc sehe ich beim Debuggen allerdings folgendes:</p>
<pre><code>(gdb) p KMT[11]
$43 = (TJoint *) 0x0                  &lt;---- Das schaut gut aus, if(Joint) wird übersprungen
(gdb) p KMT[12]
$44 = (TJoint *) 0xbabababababababa   &lt;---- Das ist != NULL aber nichts sinnvolles =&gt; Speicherzugriffsfehler
</code></pre>
<p>Eigentlich sollten alle Elemente von 0 bis 23 auf 0x0 zeigen.<br />
Darum war meine Vermutung, dass das mit dem SizeOfInt=4 nicht stimmen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367987</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Mon, 25 Nov 2013 22:07:02 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler nach Update von GCC on Mon, 25 Nov 2013 22:14:52 GMT]]></title><description><![CDATA[<p>Ich glaube ich habe das Problem gelöst.<br />
Kann es sein, dass ein int bei mir 4 und ein Pointer 8 Byte hat?</p>
<p>Ich habe es jetzt so geändert:</p>
<pre><code>#define SizeOfPointer  sizeof(double*) // vorher ((long) 4)
#define SizeOfInt      sizeof(int)     // vorher ((long) 4)
</code></pre>
<p>und</p>
<pre><code>memset(KMT, 0, N_RootCells*4 * SizeOfPointer); // vorher: SizeOfInt
</code></pre>
<p>TJoint* ist ja auch ein Pointer, also war SizeOfInt hier sowieso fehlplatziert.<br />
Jetzt läuft alles durch und ich hoffe, dass dieser Fehler nicht noch öfter drin ist.</p>
<p>Ist die Lösung in Ordnung?</p>
<p>Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367989</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Mon, 25 Nov 2013 22:14:52 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler nach Update von GCC on Mon, 25 Nov 2013 23:12:17 GMT]]></title><description><![CDATA[<p>Max3000 schrieb:</p>
<blockquote>
<p>Kann es sein, dass ein int bei mir 4 und ein Pointer 8 Byte hat?</p>
</blockquote>
<p>Ja, auf einer 64-bit Architektur hat ein Pointer gewöhnlich 8 Bytes und auf einer 32-Bit Architektur ist ein Pointer in der Regel 4 Bytes.<br />
Ein int ist meistens 4 Bytes aber darauf kannst du dich nicht verlassen. Wie gross ein int ist hängt vom Compiler ab. Der C++ Standard garantiert bloss eine Mindestgrösse.</p>
<p>Max3000 schrieb:</p>
<blockquote>
<p>Ist die Lösung in Ordnung?</p>
</blockquote>
<p>Nein. Schmeiss die ganzen #define raus (#define braucht man in C++ onehin kaum) und arbeite mit sizeof(..).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367991</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 25 Nov 2013 23:12:17 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler nach Update von GCC on Mon, 25 Nov 2013 23:17:57 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Nein. Schmeiss die ganzen #define raus (#define braucht man in C++ onehin kaum) und arbeite mit sizeof(..) sonst ist der Code nicht portabel. Ein int muss nicht zwingend 4 Bytes gross sein.</p>
</blockquote>
<p>So würde ich es machen wenn es mein eigener Code wäre.<br />
Aber in fremdem Code alles zu ändern bringt mir auch nichts, da es viel Arbeit ist und ich das beim nächsten Update alles nochmal neu machen müsste. Ich denke hier ist es einfacher das #define anzupassen:</p>
<pre><code>#define SizeOfInt sizeof(int)
</code></pre>
<p>Aber du hast natürlich recht, man braucht es eigentlich nicht.</p>
<p>Danke<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368000</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Mon, 25 Nov 2013 23:17:57 GMT</pubDate></item></channel></rss>