Segmentation fault
-
mmh wie gesagt, solange ich es in einem kleinen Programm laufen lassen, funktioniert es auch einwandfrei, aber sobald ich es in meinem eigentlichen Program laufen lasse - ist dann schon etwas umfangreicher - produziert er den obengenannten error. Aergerlich - trotzdem vielen vielen Dank fuer die Muehe die du dir mit mir gegeben hast - ich bin auf jeden Fall ein ganzes Stueckchen durch dich weiter gekommen
-
Lagrange schrieb:
...sobald ich es in meinem eigentlichen Program laufen lasse - ist dann schon etwas umfangreicher - produziert er den obengenannten error....

Also ehrlich gesagt, komme ich mir ein wenig verhonepiepelt vor - Du präsentierst uns ein absolut fehlerfrei laufendes Programm und wir sollen Dir sagen, wodurch den Fehler in einem anderen Programm von Dir stammt ?Ich würde Dir Debugging ans Herz legen: Versuche rauszubekommen, in welchem Programmteil der Fehler kommt und dann versuchen, das Programm soweit abzustrippen, dass es zwar den Fehler noch produziert, es aber übersichtlich ist.
Meine Vermutung: Beim resize() (oder anlegen) ist eine Variable nicht initialisiert, weswegen vector angewiesen wird, 868787658658239879234 Bytes Speicher anzufordern....
Aber Genaueres kann man nur mit dem Code (der den Fehler produziert und trotzdem überschaubar ist) sagen.Gruß,
Simon2.
-
Sorry, aber ich habe doch die ganze Zeit gesagt, dass es komischerweise in dem grossen Programm nicht funktioniert
Ich habe dann mit "cout" - die stelle ausmachen koennen, wo er den Fehler produziert. Und dieser Fehler tritt genau an der Stelle auf, wo ich:
std::vector<Matrix<int> > Storeschreibe! Lasse ich diesen Teil weg - oder besser ersetze ihn einfach durch etwas anderes, funktioniert das Programm einwandfrei - tut dann nur nicht mehr, das was es eigentlich soll. Also muss das schon irgendwie an diesem Ausdruck liegen. Und da er den Fehler (mit g++):
*** glibc detected *** malloc(): memory corruption (fast): 0x08fc8fa8 ***
produziert, dachte ich dass ich in der Zeile wieder etwas benutzt habe, was sich nicht mit c++ vertraegt - wie beim letzten mal (siehe anfang von diesem Thema), als der gleiche Fehler aufgetreten ist.
Ich glaube nicht, dass es irgendwas mit dem restlichen Programm zu tun hat, weil ich die Matrix Store, dann lange nicht mehr benutze - erst gegen ende wieder.
-
Hi,
habe ich vielleicht überlesen - ist aber auch egal.
Äh, verstehe ich richtig: Das Programm würde den Segfault liefern, wenn Du das Programm hinter der Zeile
Lagrange schrieb:
...
std::vector<Matrix<int> > Store...
(Da ist doch bestimmt ein ";" hinter, oder ?)
abschneiden würdest ?Probier das doch mal aus - und wenn, dann zeig doch mal das Programm bis dahin.
Gruß,
Simon2.
-
Nur eine kleine Randbemerkung: Der Copy-Ctor (für Laien:
Matrix(const Matrix& mat);, Destruktor und operator= sind für diese Klasse eigentlich überflüssig - du hast keine selbstverwalteten Daten, also reicht die implizit bereitgestellte Version dieser Methoden völlig für deine Zwecke aus.Ansonsten: Zeig doch mal ein Minimalprogramm - bei dem der Fehler wirklich auftritt.
-
Sorry, dass es so lange gedauert hat, ich musste ersteinmal meinen Erstjahresbericht fertig machen. Nun aber zurueck zum Problem. Ich habe jetzt ein Programm, wo das oben genannte Problem auftritt:
#include <cstdio> #include <cstdlib> #include <ctime> #include <cmath> #include"bamatrix.h" #include <vector> std::vector<Matrix<int> > Store; Matrix<int> Cluster(6,3); Matrix<int> Coordinates (20,2); Matrix<int> matrix1; int main() { for(int test = 0; test< 20; test++) { Coordinates[test][0] = test; Coordinates[test][1] = test; Coordinates[test][2] = test; Coordinates[test][3] = test; Coordinates[test][4] = test; Coordinates[test][5] = test; } Cluster[0][3] = 4; Cluster[1][3] = 6; Cluster[2][3] = 2; Cluster[3][3] = 4; Cluster[4][3] = 1; Cluster[5][3] = 3; int index = 6; int sumclustersize = 0; for(int t = 0; t < index; t++) { int j1 = 0; cout << Cluster[t][3] << endl; matrix1.resize(Cluster[t][3],6); for(int j2 = sumclustersize; j2 < sumclustersize+Cluster[t][3]; j2++) { matrix1[j1][0] = Coordinates[j2][0]; matrix1[j1][1] = Coordinates[j2][1]; matrix1[j1][2] = Coordinates[j2][2]; matrix1[j1][3] = Coordinates[j2][3]; matrix1[j1][4] = Coordinates[j2][4]; matrix1[j1][5] = Coordinates[j2][5]; j1++; } j1 = 0; sumclustersize = sumclustersize+Cluster[t][3]; Store.push_back(matrix1); } }Ich bekomme mit g++ folgende Fehlermeldung:
*** glibc detected *** free(): invalid next size (fast): 0x089142f0 ***
AbortedSehr komisch ist auch, dass wenn ich "Matrix<int> matrix1;" nicht vor die Main-Funktion setze, sondern ins Programm, bekomme ich einen Segmentation Error und zwar an der Stelle, an der ich versuche die Groesse von matrix1 versuche zu aendern.
Nocheinmal vielen vielen Dank fuer eure Hilfe
-
Lagrange schrieb:
Matrix<int> Cluster(6,3); Matrix<int> Coordinates (20,2); Matrix<int> matrix1; [...] for(int test = 0; test< 20; test++) { Coordinates[test][0] = test; Coordinates[test][1] = test; Coordinates[test][2] = test; Coordinates[test][3] = test; Coordinates[test][4] = test; Coordinates[test][5] = test; }Und da wunderst du dich über irgendwas? Du schreibst ja auch deutlich über das Ende des reservierten Speichers hinaus (Coordinates wurd mit 20 Zeilen und 2 Spalten angelegt, du schreibst dort in die 6. Spalte
(auch die Einträge 'Cluster[x][3]' weiter unten liegen außerhalb des Bereiches, den du vorher angefordert hast)
-
Ich bin doch so ein Affe - ich hatte die Matrizen zunaechst fuer eine andere Funktion programmiert und dann vergessen die Groesse zu aendern. Aber warum hat mir dann der Compiler nicht in Zeile 22 eine Fehlermeldung geben. Ich glaube ich bin einfach zu dumm fuer c++

Nochmal danke fuer deine Hilfe - bis spaeter

-
Wieso sollte er? vector<>::op[] hat keine Bereichsüberprüfung und aus Sicht des Compilers ist nichtmal klar, ob die Breite an dieser Stelle immer noch 2 ist (oder gar was die 2 bei Ctor-Aufruf bedeutet). Du könntest höchstens at() anstelle des Operators nutzen, dann beschwert sich das Programm an der richtigen Stelle.
-
Die gerechte Strafe für magische Konstanten
