<?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[Segmentation Fault nachvollziehen]]></title><description><![CDATA[<p>Hallo,</p>
<p>hatte neulich folgendes Problem: Wann immer ich folgende Klasse:</p>
<pre><code>//A.h:
#ifndef __A_h
#define __A_h

#include &lt;string&gt;

class A;
typedef bool (A::*Foo)(std::string);

class A{
   static const std::string error_msg1;
   static const std::string error_msg2;

   struct My_Struct{
	Foo foo;
	std::string s;
   };

   static My_Struct struct_array[]; 

   bool my_funct(std::string s);
};

#endif

//A.cpp:
#include &quot;A.h&quot;

A::My_Struct A::struct_array[] = {
   {&amp;A::my_funct,error_msg1}
   {&amp;A::my_funct,error_msg2}
}; 

const std::string A::error_msg1 = &quot;error!&quot;;
const std::string A::error_msg2 = &quot;error!&quot;;

bool A::my_funct(std::string s){
 return 1;
}
</code></pre>
<p>gegen mein Projekt gelinkt habe kam es zu Segmentation Faults, bevor die main ueberhaupt ausgefuehert wurde. Dazu reichte eine main.cpp, die nur &lt;return 1;&gt; ausfuehrte und die A.h nicht einmal inkludiert hat.<br />
Nach langer Suche hab ich dann den Fehler gefunden: error_msg1 wird nach struct_array definiert. Vertausche ich die Definitionen in der A.cpp, so laeuft es problemlos. 'error_msg2' kann aber durchaus unter &lt;struct_array =...&gt; stehen bleiben.</p>
<p>Bei solchen Problemen merke ich immer wieder, dass ich keine Ahnung von C++ habe. Kann mir das hier jemand erklaeren?<br />
Das der Compiler das nicht merkt kann ich noch nachvollziehen. Aber warum kann error_msg2 unten stehen bleiben? Das ist vermutlich nur Zufall? Und warum fuehrt es zu Segmentation Faults, so bald ich das Programm ausfuehre? Werden die statischen Member alle zu Beginn des Programms angelegt und nicht etwa, wenn das erste mal eine Klasse instanziert wird?</p>
<p>Dann wuerde mich noch interessieren, wie ich solche Fehler schneller finde? Ein Debugger scheint nicht viel zu helfen, vor dem ersten Breakpoint ist das Programm bereits wieder beendet. Coredumps? Kann man daraus mit Ahnung solche Probleme erkennen?</p>
<p>Ich freue mich sehr ueber Antworten!<br />
Danke im Voraus! <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>P.S.: Ich umgehe static in der Regel auch so gut wie moeglich, aber hier erschien mir diese Loesung recht schoen, weil leicht anzupassen, leicht verstaendlich und kurz.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/237581/segmentation-fault-nachvollziehen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 09:34:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237581.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 30 Mar 2009 23:50:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Segmentation Fault nachvollziehen on Mon, 30 Mar 2009 23:50:12 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>hatte neulich folgendes Problem: Wann immer ich folgende Klasse:</p>
<pre><code>//A.h:
#ifndef __A_h
#define __A_h

#include &lt;string&gt;

class A;
typedef bool (A::*Foo)(std::string);

class A{
   static const std::string error_msg1;
   static const std::string error_msg2;

   struct My_Struct{
	Foo foo;
	std::string s;
   };

   static My_Struct struct_array[]; 

   bool my_funct(std::string s);
};

#endif

//A.cpp:
#include &quot;A.h&quot;

A::My_Struct A::struct_array[] = {
   {&amp;A::my_funct,error_msg1}
   {&amp;A::my_funct,error_msg2}
}; 

const std::string A::error_msg1 = &quot;error!&quot;;
const std::string A::error_msg2 = &quot;error!&quot;;

bool A::my_funct(std::string s){
 return 1;
}
</code></pre>
<p>gegen mein Projekt gelinkt habe kam es zu Segmentation Faults, bevor die main ueberhaupt ausgefuehert wurde. Dazu reichte eine main.cpp, die nur &lt;return 1;&gt; ausfuehrte und die A.h nicht einmal inkludiert hat.<br />
Nach langer Suche hab ich dann den Fehler gefunden: error_msg1 wird nach struct_array definiert. Vertausche ich die Definitionen in der A.cpp, so laeuft es problemlos. 'error_msg2' kann aber durchaus unter &lt;struct_array =...&gt; stehen bleiben.</p>
<p>Bei solchen Problemen merke ich immer wieder, dass ich keine Ahnung von C++ habe. Kann mir das hier jemand erklaeren?<br />
Das der Compiler das nicht merkt kann ich noch nachvollziehen. Aber warum kann error_msg2 unten stehen bleiben? Das ist vermutlich nur Zufall? Und warum fuehrt es zu Segmentation Faults, so bald ich das Programm ausfuehre? Werden die statischen Member alle zu Beginn des Programms angelegt und nicht etwa, wenn das erste mal eine Klasse instanziert wird?</p>
<p>Dann wuerde mich noch interessieren, wie ich solche Fehler schneller finde? Ein Debugger scheint nicht viel zu helfen, vor dem ersten Breakpoint ist das Programm bereits wieder beendet. Coredumps? Kann man daraus mit Ahnung solche Probleme erkennen?</p>
<p>Ich freue mich sehr ueber Antworten!<br />
Danke im Voraus! <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>P.S.: Ich umgehe static in der Regel auch so gut wie moeglich, aber hier erschien mir diese Loesung recht schoen, weil leicht anzupassen, leicht verstaendlich und kurz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688508</guid><dc:creator><![CDATA[cess]]></dc:creator><pubDate>Mon, 30 Mar 2009 23:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to Segmentation Fault nachvollziehen on Tue, 31 Mar 2009 00:42:46 GMT]]></title><description><![CDATA[<p>Ich bin etwas müde, daher gebe ich aktuell gar keine Garantie für meine geleistete Hilfestellung <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="😃"
    /></p>
<p>Aber wenn mein Kopf noch einigermasen richtig arbeitet, dann ist das folgende undefiniert:</p>
<pre><code class="language-cpp">A::My_Struct A::struct_array[] = { 
   {&amp;A::my_funct,error_msg1} 
   {&amp;A::my_funct,error_msg2} 
}; 

const std::string A::error_msg1 = &quot;error!&quot;; 
const std::string A::error_msg2 = &quot;error!&quot;;
</code></pre>
<p>Die Initialisierung von statischen Membern erfolgt in der Reihenfolge, in welcher die Member in der Übersetzungseinheit vorkommen. Du verwendest hier also <code>error_msg1</code> und <code>error_msg2</code> , bevor diese überhaupt initialisiert worden sind. Wodurch wahrscheinlich undefiniertes Verhalten entsteht und ein Segmentation Fault möglich ist.</p>
<p>Also probier die Sache mal umzukehren:</p>
<pre><code class="language-cpp">const std::string A::error_msg1 = &quot;error!&quot;; 
const std::string A::error_msg2 = &quot;error!&quot;;

A::My_Struct A::struct_array[] = { 
   {&amp;A::my_funct,error_msg1} 
   {&amp;A::my_funct,error_msg2} 
};
</code></pre>
<p>cess schrieb:</p>
<blockquote>
<p>Das ist vermutlich nur Zufall?</p>
</blockquote>
<p>Deswegen könnte ich mir auch gut vorstellen, dass es wirklich durch undefiniertes Verhalten ausgelöst wird. Zufälle in C und C++ sind meistens ein guter Hinweis auf undefiniertes Verhalten.</p>
<p>cess schrieb:</p>
<blockquote>
<p>Werden die statischen Member alle zu Beginn des Programms angelegt und nicht etwa, wenn das erste mal eine Klasse instanziert wird?</p>
</blockquote>
<p>Die statischen Member werden sicher nicht erst dann angelegt, wenn das erste mal ein Objekt der Klasse instanziert wird. Denn statische Member sind ja gerade unabhängig von den Objekten der Klasse. Du kannst im ganzen Programmcode nie ein Objekt von der Klasse instanzieren und trotzdem müssen die statischen Member zur Verfügung stehen.</p>
<p>Wann genau die statischen Member angelegt werden, weiss ich jetzt allerdings nicht mehr mit Sicherheit. Ich dachte der Speicher muss vor dem Programmstart zur Verfügung stehen. Die Initialisierung ist gewissen zusätzlichen Regeln unterstellt, aber der Kompiler hat hier, glaube ich, auch eine gewisse Freiheit zu entscheiden, wann er die Variablen initialisieren will.<br />
Also Speicher reservieren beim Programmstart, Initialisierung Kompiler spezifisch mit gewissen Regeln.</p>
<p>Und nun gehe ich schlaaafeen <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688512</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 31 Mar 2009 00:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to Segmentation Fault nachvollziehen on Tue, 31 Mar 2009 21:42:19 GMT]]></title><description><![CDATA[<p>Cool, danke fuer die Antwort. Das mit der Reihenfolge hatte ich ja auch schon rausgefunden. Finde es nur schade, dass der Compiler das nicht bemerkt - ich seh schon ein, dass es bei static Membern ein ziemlicher Aufwand waere das zu ueberpreufen, aber nach sowas sucht man sich ja tot.<br />
Generell wird mir dadurch nochmal bestaetigt static so wenig wie moeglich zu verwenden.</p>
<p>Wenn noch jemand Tipps hat, wie man sowas schnell findet immer her damit. <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/1689084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689084</guid><dc:creator><![CDATA[cess]]></dc:creator><pubDate>Tue, 31 Mar 2009 21:42:19 GMT</pubDate></item></channel></rss>