PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mal wieder ein schöner Segfault ;-)



axeljaeger
09-11-2003, 17:29
Ich hab ein Problem mit der dynamischen Speicherverwaltung. Ich habe eine Methode, die öfters aufgerufen wird. In dieser Methode wird einiges an Speicher bestellt. Der sollte meiner Meinung nach auch wieder freigeben werden und ich glaube, die Praxis gibt mir Recht, jedenfalls stürzt das Programm ab, wenn die Methode dreimal gelaufen ist und kein Speicher freigeben wurde. Wenn ich aber jetzt den Speicher freigebe, stürzt mein Programm sofort ab, nachdem ich das erste mal delete gesagt hab:



void MaskTool::handleMouseRelease(Document* doc, const QPoint & pos)
{
ArtVpath* br = art_new(ArtVpath, 5);

(...)

double matrix[6];
art_affine_scale (&matrix[0],1.0,doc->height() / (double)doc->width());

ArtVpath* circle = art_vpath_new_circle(doc->width() / 2.0, doc->width() / 2.0, doc->width() / 2.0);
ArtVpath* squeezedcircle = art_vpath_affine_transform(circle,matrix);

ArtSVP* circlesvp = art_svp_from_vpath(squeezedcircle);
ArtSVP* rectsvp = art_svp_from_vpath(br);

ArtSVP* finalsvp = art_svp_intersect(rectsvp, circlesvp);

QImage mask = Crimson::instance()->currentDoc()->mask();

mask.create(doc->width(), doc->height(), 8,256);
mask.fill(0);

art_gray_svp_aa (finalsvp,0,0,doc->width(), doc->height(), mask.bits(), doc->width());

for(int i = 0; i < 256; i++)
mask.setColor(i, qRgb(i,i,i));


delete [] br; // Natürlich war immer nur eins von den dreien hier drinn,
art_free(br); //das Programm stürzt immer hier ab, egal welche Variante
delete br;

}


art_new ist wie folgt definiert:


#define art_new(type, n) ((type *)art_alloc ((n) * sizeof(type)))

und art_alloc:


#define art_alloc malloc


Die ganzen Funktionen von libart liefern immer einen anscheinend neu angelegten Pointer auf einen neuen ArtVpath bzw. ArtSVP zurück.

Edit: Interessanterweise wird im Tutorial der Dokumentation zu libArt der Speicher auch nicht freigegeben. Ob das was damit zu tun hat, das da Gnome mit drin ist?

http://www.gnome.org/~mathieu/libart/libart.html

und das Tutorial:
http://www.gnome.org/~mathieu/libart/sample.html#SAMPLE-NON-DISPLAY

wraith
09-11-2003, 18:20
Wenn du Speicher mit malloc anforderst,dann mußt du auch mit free wieder freigeben.
In deinem Codeschnispel wird *br nur einmal benutzt (art_svp_from_vpath),sicher das du dort nicht über die Speichergrenzen schreibst?
Stürzt er auch ab,wenn du die Zeile auskommentierst?
Weiterhin sehe ich hier keinen Grund mit malloc zu arbeiten,du forderst immer eine feste Größe an,nimm gleich ein array.

axeljaeger
09-11-2003, 18:45
Das ich über die Speichergrenze hinausschreibe, könnte sein, ich schreibe etwas in das Element mit der Nummer 5, und da der Index bei 0 anfängt -> peng! In dem einen Fall könnte ich wirklich ein Array verwenden, aber bei den anderen Sachen (circle, rectsvp) muss ich doch auf jeden Fall löschen? Und kann das sein, das der Segfault in delete auftritt, wenn ich über den Speicher hinausgeschrieben hab?

wraith
09-11-2003, 18:57
Original geschrieben von axeljaeger
Und kann das sein, das der Segfault in delete auftritt, wenn ich über den Speicher hinausgeschrieben hab?
Jepp,das ist typisch.
Nach dem allokierten Speicher wird in die Bytes ein bestimmtes Muster vom Compiler gelegt.
Jetzt überschreibst du dieses,und das wird von delete erkannt -> Seg. Fault.