Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
C++/Segfault

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Verzweifler
Gast





BeitragVerfasst am: 18. Jan 2002 15:34   Titel: C++/Segfault

Hallo,

Ich habe hier ein C++ Programm, dass nach ausführen mit "Segmentation Fault" abbricht. Wenn ich mir per Debugger anschauen will, an welcher stelle es passiert, finde ich ihn irgendwo in den C++ Standardfunktionen, nicht aber in meinem Code !!

Leider habe ich keine Ahnung, wie ich vorgehen soll um den Fehler zu beheben...Kann mir da jemand helfen ?
Am Besten wäre es, wenn man C++ in einem Modus so wie Java laufen lassen könnte, sodass jede illegale Speicheranweisung abgefangen würde, z.B.
main()
{
int array[5];
array[5] = 1313;
}
Sowas geht of einfach, und der Fehler ist nicht auffindbar...

Bitte helft mir, bin schon am verzweifeln (Alles neuschreiben ?!?!?)
 

??
Gast





BeitragVerfasst am: 18. Jan 2002 16:45   Titel: Re: C++/Segfault

Du arbeitest noch mit Arrays? In welchem Jahrtausend leben wir denn?
 

Verzweifler
Gast





BeitragVerfasst am: 18. Jan 2002 16:49   Titel: Re: C++/Segfault

Vielen Dank für die Hilfreiche Nachricht
 

tj
Gast





BeitragVerfasst am: 18. Jan 2002 17:35   Titel: Re: C++/Segfault

Hi,

in C sind gueltige Indices fuer
int array[5];
nur 0,1,2,3,4 und NICHT 5. Daher der SegFault.

Gruesse, tj
 

axeljaeger
Gast





BeitragVerfasst am: 18. Jan 2002 21:53   Titel: Re: C++/Segfault

> Du arbeitest noch mit Arrays? In welchem Jahrtausend leben wir denn?
Mach mal einen besseren Vorschlag, ich finde Arrays auch nicht Ideal, weis aber nicht, wie man es besser machen kann
 

bakunin



Anmeldungsdatum: 16.08.1999
Beiträge: 597
Wohnort: Lorsch (Südhessen)

BeitragVerfasst am: 19. Jan 2002 2:17   Titel: Re: C++/Segfault

Hi!

> ich finde Arrays auch nicht Ideal, weis aber nicht, wie man es besser machen kann

Nun, ursprünglich war C++ ja ein C, das mit allen Schlüsselwörtern vollgestopft wurde, die irgendwo auffindbar waren, bei dem aber dafür vergessen wurde, eine Klassenbibliothek hinzuzufügen. Um die Sprache nachträglich noch halbwegs erträglich zu machen, wurde dann irgendwann noch die STL draufgepfropft. Die STL ist gut in Bjarne Stroustrups "Die C++ Programmiersprache", das jeder ernsthafte C++-Entwickler im Regal stehen (oder alternativ vor sich liegen) haben sollte, beschrieben. Wer für die miserable Übersetzung dieses etwas chaotisch organisierten (aber dennoch sehr lehrreichen) Buches kein Geld ausgeben will, der findet STL-Dokumentation auch hier. Ich denke, dass man inzwischen voraussetzen kann, dass ein vernünftiges, halbwegs aktuelles System auch über die STL verfügt, d.h. man kann sie bedenkenlos einsetzen. Es macht einem das Leben mit C++ wirklich um ein Vielfaches leichter. Und insbesondere muss man keine Arrays mehr verwenden.

Viele Grüße,
Wolf "nicht gut auf C++ zu sprechen" gang

PS: Alle destruktiven Äußerungen in obigem Text kann ich auf Wunsch gerne näher erläutern.

PPS: C-Programmierern, jene die Mächtigkeiten der STL mögen, sich aber C++ nicht antun möchten, sei an dieser Stelle die unter der GNU Lesser-GPL stehende c2lib empfohlen.

PPPS: Zum eigentlichen Problem: Der Verzweifler hat eben buggy Code geschrieben. Ist ja nichts Ungewöhnliches, es ist im Gegenteil ja sogar notwendig. So einen Fehler muss man halt korrigieren. Wenn eine Bibliotheksfunktion crasht, ist entweder die Bibliothek buggy (unwahrscheinlich) oder man hat ihr fehlerhafte Parameter übergeben (viel wahrscheinlicher).
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

Descartes
Gast





BeitragVerfasst am: 19. Jan 2002 16:16   Titel: Re: C++/Segfault

Wenn du C++ nehmen möchtest warum dann statt int* nicht vector<T> verwenden ?

code:

#include <iostream>
#include <vector>

using namespace std;

int main(int argc, char** argv)
{
// vector<T> mit 5 int-Elementen, alle Elemente mit 0 initialisieren
// alternativ:
// vector<int> vec(5);
vector<int> vec(5, 0);
vec[1] = 5;

for(unsigned int i=0; i<vec.size(); i++)
cout << i << ". Element = " << vec[i] << endl;

// hier crasht nix, wird halt vom vector<T> abgefangen
vec[5] = 5;

return 0;
}

 

Verzweifler
Gast





BeitragVerfasst am: 20. Jan 2002 11:03   Titel: Re: C++/Segfault

Danke für die Antworten....

Aber ich verstehe es immer noch nicht ganz, wie man so einen Segfault flott finden soll. Ich habe jetzt ~3h in den Code geschaut, biss ich die anweisung (in.substr(i, 1) entdeckte, wobei eigentlich in.substr(0, 1) stehen müsste.... Warum ist er nicht einfach bei der Anweisung rausgeflogen, und hat gesagt (so wie Java das kann)
String out of bounds exception in molecule.cpp line 232

Das hätte mir sofort geholfen..... Aber nein, einfach irgend ein segfault wird geschmissen. Auch die Sache mit meinem Debuger ist mir schleierhaft (ddd, frontend zu gdb): Der fliegt auch nicht in der Zeile raus sondern erst später !

Ich verstehe es, dass es Performance kosten würde, immer zu überprüfen, ob die Argumente auch alle gültig sind (so wie: string string::substring(int start, int length) { if(start + length > this.legth()) ....} ),
ABER: Für die Debug Phase ist es doch gut, wenn man derartige Sachen geprüft kriegt...
Es wäre also doch gut, wenn man ein Programm in der Debug Phase auf einer Virtuellen Maschine startet, die bei sofort stoppt, wenn von der falschen Anweisung auf den falschen Speicher zugegrifen wird (nicht, wie in C++, wo man oft keinen segfault kriegt, wenn man über grenzen geht, weil dieser Speicher noch irgendwie zu anderen Code/Variablen gehört....)

Frage:
Gibt es so etwas ?
Ist sowas in arbeit ? (Warum nicht ?)

Verzweifler
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy