Nun gut. Eine andere Sache, was ich mal früher ausprobiert hatte, war eine Art GC in Delphi. Und zwar kann man ja mittels RTTI zumindest die published Eigenschaften auslesen. Wenn man alle erstellen Objekte in einer Liste sammelt kann man dann von Zeit zur Zeit über den ganzen Graphen gehen und nachsehen welche Objekte noch erreichbar sind. Da man natürlich recht eingeschränkt Zugriff auf den Stack hat, hatte ich das so gemacht, dass einige zentrale Objekte dann als statisch registiert wurden und von denen aus dann der ganze erreichbare Objektgraph markiert wurde. Jedenfalls hat man dann zwar nicht die Geschwindigkeit von .Net, aber man ist sicher das nichts vergessen wurde.
Hmm, komisch, auf dieselbe idee kam ich letztens wo ich gezwungen wurde mit Delphi.Win32 zu programmieren!
_________________ Shareholder und Leitender Entwickler bei Pipedream-Games.
Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also selber ne eigene GC aufzubauen halte ich auch nicht unbedingt für das Beste. Eben auch darum, weil es sehr tief ins system geht und nicht das schnellste sein wird.
glBitmap: Ja du hast recht. Ich erstelle dort einen Pointer und gebe ihn dort nicht sofort wieder frei. Das liegt aber daran, dass ich den noch weiterverwende, weil sich dann dort drinne die Bilddaten befinden. So habe ich mir ein mal kopieren gesparrt. Kann mir also nicht vorstellen wo das Problem liegen könnte. Habe es ja selber schon ausreichend getestet. Werde es aber noch mal prüfen.
Wenn du mit Objekten arbeitest wuerde ich TObjectList verwenden. Wenn du die mit MyList:=TObjectList.Create(True) erzeugst gehoeren die Objekte in der Liste der Liste und werden bei einem MyList.Free oder MyList.Clear automatisch abgebaut.
Von wegen nicht buggy. Versuch mal eine Prozedur mit zwei varianten arrays und nem Vorgabeparameter zu erstellen. Bis NT4 klappts prima, ab win3k vergisst er glatt, das 2. array auf den stack zu packen und schlägt beim Begin in der prozedur der Länge nach hin.
Beispiel:
Und bei Array of Variant im Übergabeparameter interpretiert eir einen übergebenen String als Array of Char beim Stackschieben
Code:
...
Test2('Hallo');//kracht gewaltig
Test2(12345);//klappt prima
...
Procedure Test2(_avParam:ArrayofVariant);
Begin
...
End;
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Mittlerweile weiß ich net ob ich denkbar oder sauer über den Fehler sein soll. Ich hab gerade soviele Speicherlöcher gefunden und vernichtet....wahnsinn... Andererseits debugge ich Code der schon ewig in benutzung ist, nicht von mir stammt und eigentlich auch nicht so die lieblingsstelle in dem Projekt ist...
Das mit der ObjectList werd ich mir merken. Das spart sicherlich einige Zeilen Code.
Tokter hat geschrieben:
Das hier laeuft bei mir ohne Probleme (Delphi5/Win2k):
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Leute saugt euch memChk!!!
Was ich schon für Speicherlöcher hier ausgemerzt hab is echt nicht normal...Sachen wo man denkt "Da kann gar nix verloren gehn" habens echt in sich. MemChk hatte bisher immer recht...Ich hab gezweifelt ob das sein kann, was dort in dem Logfile steht...aber wenn man lange genug sucht findet man raus, dass z.B. eine leere TList überschrieben wird. Fällt niemanden auf...außer memChk... Echt der hammer die Lib.
@Lossy: Zieh dir mal das Ding. Die einzigen 4 speicherlöcher (und noch dazu die größten) die ich net wegbekomme stammen von deinem MemAlloc. Und ich will wetten memChk hat auch hier recht...
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wenn du uns auch sagst woher, dann werde ich das Teil auch mal ausprobieren. Wie gesagt. Ich gebe alles immer schön frei. Spätestens dann wenn die Klasse freigegeben wird. Bin mir also keiner Schuld bewusst.
Hier einige Codefragmente die meine Unschuld zu beweisen.
Code:
function TglBitmap2D.FlipVert:Boolean;
begin
...
pDest:=AllocMem(Height * RowSize);
...
SetDataPtr(pDest);
...
end;
procedure TglBitmap.SetDataPtr(Ptr:PByte);
begin
if FDataPtr <> Ptrthenbegin
if(Assigned(FDataPtr))
thenFreeMem(FDataPtr);
FDataPtr :=Ptr;
end;
end;
procedure TglBitmap.BeforeDestruction;
begin
SetDataPtr(nil);
end;
Und das Läuft überall so ab. Außer an zwei Stellen da kopiere ich die Daten lediglich in den anderen Speicher und geben den dann frei. Ist bei mir aber schon gefixed. Niemand darf direkt schreibend auf den Pointer zugreifen. Nur über die Methode SetDataPtr. Und damit ist sichergestellt, dass alles freigegeben wird.
MemCheck kenne ich auch. Das zeigt doch auch die Zeilennummer an, in der der Speicher belegt wurde. Da müßte man das dann doch weiter eingrenzen können.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ah. Mit nem passenden Name hab ich das auch gefunden. Kann das allerdings immer noch nicht nachvollziehen. Habe auch gerade meine Developerversion bei seite gelegt und die letzte veröffentlichte geschnappt aber auch da nicht. Als ich absichtlich etwas eingebaut hatte, hatte ich auch Meldungen. Aber sonst 0. Zur Not hänge das Log mal an oder schick es mir per Mail (falls es nicht jeder sehen soll). Dann schaue ich mir das mal an und versuche etwas zu finde. So kann ich jetzt nichts bösartiges ausmachen.
Zeilennummern zeigt er bei mir nicht an. Oder nur so bei 1 oder 2 Zeilen pro Fehler. Die aber meist weiter oben liegen. Da nützt einem das recht wenig.
[edit] Wenn MemProof richtig eingestellt ist (er also die Codes finden kann) zeigt er einem auch gleich die passende Quellcodestelle an.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Zum MemProof hatte ich keine Hilfe gefunden. Und ohne Hilfe konnte ich nur soweit das Programm vestehn, dass ich die Exe aus dem raus gestartet habe. Alle anderen Funktionen sind mir verborgen geblieben.
Hmmm... ich glaub ich hba noch ne ältere Version von deinem Loader... Ich werd mir mal die neue Ziehn und gucken obs dann klappt.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Freigegeben werden müssen eigentlich alle Sachen, die du vorher initialisierst. Also Klassen mit TObject.Create zum Bleistift. Texturen werden meist vom Treiber freigegeben, aber da kann man sich auch nicht drauf verlassen. Dann musst du natürlich bei Zeigern aufpassen auf erzeugte Klassen.
Objekte muss man auch freigeben. Siehe das Octree-Tutorial von Soulchild. Dort werden objects verwendet und wieder freigegeben.
_________________ "Für kein Tier wird so viel gearbeitet wie für die Katz'."
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.