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%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.
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 .
Fügen Sie eine return-Anweisung zu Ihrem main () hinzu. Ich bin überrascht, dass dein Compiler dich nicht davor gewarnt hat.
Tags und Links c++ g++ segmentation-fault