g ++ erzeugt segfault mit normaler Kompilierung, aber keine mit -g

9

Ich lerne gerade C ++ mit Bruce Eckels "Thinking in C ++" und ich bin in den ersten Kapiteln. Ich habe einen C- und Java-Hintergrund. Im Moment habe ich folgendes Problem: Wenn ich die Quellen unten mit

kompiliere %Vor%

, das Programm gibt eine "1" (korrekt) und dann einen segfault aus. Wenn ich mit

kompiliere %Vor%

, das exakt gleiche Programm erzeugt einen 1 und NO segfault! Ich muss sagen, ich finde das erstaunlich. Könnte jemand darauf hinweisen, was ich falsch mache? Mein Betriebssystem ist "Linux 2.6.35-30-generic # 54-Ubuntu x86_64", mein g ++ ist Version "g ++ (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5".

EDIT: Nur weil das eine wichtige Quelle des Fehlers zu sein scheint, danke @Evan Teran: Der A-Konstruktor in der B-Struktur wird nie aufgerufen! Ich habe ein "cout & lt; & lt;" blah "& lt; & lt; endl;" innen und es druckt nichts

BEARBEITEN: Ich habe jetzt das "return 0" am Ende von main eingefügt, aber das hilft nicht.

A.h:

%Vor%

A.cpp:

%Vor%

B.h:

%Vor%

B.cpp:

%Vor%

bmain.cpp:

%Vor%

EDIT: Ich habe g ++ von den Paketen installiert. Mein Ubuntu ist auch sehr Standard.

Das bekomme ich, wenn ich anrufe     gdb a.out Kern

%Vor%

EDIT 2: BTW, meine Hardware ist meines Wissens nicht fehlerhaft und ich behandle das OS sehr gut

EDIT 3: Valgrind meldet Folgendes:

%Vor%     
Hinton 15.07.2011, 13:29
quelle

3 Antworten

5

Wie es aussieht, scheint es ein Fehler in der GCC / libstdc ++ -Packung / -Bauweise oder in der verwendeten Version zu sein. Versuchen Sie GCC 4.5 oder 4.6 und wenn es dort nicht passiert, sagen Sie sich immer die neuesten und besten (bis das natürlich etwas bricht) und schauen Sie nie zurück.

Es scheint, dass der Compiler das A -Member in B nicht initialisiert, was dazu führen würde, dass der Destruktor von std::string die notwendigen Informationen nicht lesen könnte, um sich selbst zu zerstören. Aber das ist nur Vermutung und Vermutungen.

    
rubenvb 15.07.2011, 14:10
quelle
0

Sie rufen fast sicher undefiniertes Verhalten (UB) irgendwo in Ihrem Programm auf. Der Punkt von UB ist, dass das Verhalten nicht nur undefiniert ist, sondern sich je nach Plattform, Compiler, Flags usw. ändern kann. Das Hinzufügen von -g ist vermutlich eine Störung der Dinge, um den Segfault zu vermeiden, aber das ist nur Zufall .

    
Oliver Charlesworth 15.07.2011 13:34
quelle
-5

Fügen Sie eine return-Anweisung zu Ihrem main () hinzu. Ich bin überrascht, dass dein Compiler dich nicht davor gewarnt hat.

Funktion mit fehlendem Rückgabewert, Verhalten zur Laufzeit

    
SierraZulu 15.07.2011 13:45
quelle

Tags und Links