Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 08:17

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 42 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 21, 2005 23:03 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
LarsMiddendorf hat geschrieben:
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 21, 2005 23:43 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die Idee gefällt mir gar nicht... Da verkürzt sich meine Lebenszeit rapide, wenn ich sowas in den PBallManager einbauen soll. :x


@LossyX: Dein TglBitmap2D.FlipVert() hat laut MemLeak ein Speicherleck durch AllocMem.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 22, 2005 05:21 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 22, 2005 15:04 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 22, 2005 16:07 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
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:
Code:
  1.  
  2. Procedure Test(_asErster: Array of String; _asZweiter: Array of String; _bDritter: Boolean=true);
  3.  

Und bei Array of Variant im Übergabeparameter interpretiert eir einen übergebenen String als Array of Char beim Stackschieben
Code:
  1.  
  2. ...
  3.   Test2('Hallo'); //kracht gewaltig
  4.   Test2(12345); //klappt prima
  5. ...
  6.  
  7. Procedure Test2(_avParam: Array of Variant);
  8. Begin
  9. ...
  10. End;
  11.  

_________________
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 22, 2005 17:05 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
Das hier laeuft bei mir ohne Probleme (Delphi5/Win2k):
Code:
  1. procedure TForm1.Test(_asErster: Array of String; _asZweiter: Array of String; _bDritter: Boolean=true);
  2. var
  3.   i : integer;
  4. begin
  5.   for i:=low(_asErster) to high(_asErster) do Memo1.Lines.Add(_asErster[i]);
  6.   for i:=low(_asZweiter) to high(_asZweiter) do Memo1.Lines.Add(_asZweiter[i]);
  7. end;
  8.  
  9. procedure TForm1.Test2(_avParam: Array of Variant);
  10. var
  11.   i : integer;
  12. begin
  13.   for i:=low(_avParam) to high(_avParam) do Memo1.Lines.Add(_avParam[i]);
  14. end;
  15.  
  16. procedure TForm1.Button1Click(Sender: TObject);
  17. var
  18.   a,b : array of string;
  19.   c   : array of variant;
  20. begin
  21.   //Test 1
  22.   SetLength(a,2);
  23.   a[0]:='a[0]';
  24.   a[1]:='a[1]';
  25.   SetLength(b,2);
  26.   b[0]:='b[0]';
  27.   b[1]:='b[1]';
  28.   Test(a,b,true);
  29.  
  30.   //Test 2
  31.   SetLength(c,2);
  32.   c[0]:='c[0]';
  33.   c[1]:=12345;
  34.   Test2(c);
  35. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 22, 2005 19:01 
Offline
Guitar Hero
Benutzeravatar

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...:oops: 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... :roll:


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):
Code:
  1. procedure TForm1.Test(_asErster: Array of String; _asZweiter: Array of String; _bDritter: Boolean=true);
  2. var
  3.   i : integer;
  4. begin
  5.   for i:=low(_asErster) to high(_asErster) do Memo1.Lines.Add(_asErster[i]);
  6.   for i:=low(_asZweiter) to high(_asZweiter) do Memo1.Lines.Add(_asZweiter[i]);
  7. end;
  8.  
  9. procedure TForm1.Test2(_avParam: Array of Variant);
  10. var
  11.   i : integer;
  12. begin
  13.   for i:=low(_avParam) to high(_avParam) do Memo1.Lines.Add(_avParam[i]);
  14. end;
  15.  
  16. procedure TForm1.Button1Click(Sender: TObject);
  17. var
  18.   a,b : array of string;
  19.   c   : array of variant;
  20. begin
  21.   //Test 1
  22.   SetLength(a,2);
  23.   a[0]:='a[0]';
  24.   a[1]:='a[1]';
  25.   SetLength(b,2);
  26.   b[0]:='b[0]';
  27.   b[1]:='b[1]';
  28.   Test(a,b,true);
  29.  
  30.   //Test 2
  31.   SetLength(c,2);
  32.   c[0]:='c[0]';
  33.   c[1]:=12345;
  34.   Test2(c);
  35. end;


Bei mir auch. (D5/WinXP)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 22, 2005 23:34 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 23, 2005 05:37 
Offline
DGL Member
Benutzeravatar

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:
  1. function TglBitmap2D.FlipVert: Boolean;
  2. begin
  3.     ...
  4.     pDest := AllocMem(Height * RowSize);
  5.     ...
  6.     SetDataPtr(pDest);
  7.     ...
  8. end;
  9.  
  10.  
  11. procedure TglBitmap.SetDataPtr(Ptr: PByte);
  12. begin
  13.   if FDataPtr <> Ptr then begin
  14.     if (Assigned(FDataPtr))
  15.       then FreeMem(FDataPtr);
  16.  
  17.     FDataPtr := Ptr;
  18.   end;
  19. end;
  20.  
  21.  
  22. procedure TglBitmap.BeforeDestruction;
  23. begin
  24.   SetDataPtr(nil);
  25. 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.

Größe: Bei Bildern ja vollkommen normal. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 23, 2005 08:34 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 23, 2005 09:31 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 23, 2005 10:58 
Offline
Guitar Hero
Benutzeravatar

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... :shock: ich glaub ich hba noch ne ältere Version von deinem Loader... :oops: Ich werd mir mal die neue Ziehn und gucken obs dann klappt.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 23, 2005 21:32 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Habe ich gerade gesehen:
http://www.delphipraxis.net/topic64173_ ... inden.html


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 24, 2005 13:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Ich muss mal was einwerfen:

Was ist eogentlich ein speicherleck :?:

Ist dass, wenn ich vergesse was freizugeben und da tote daten aufm speicher rumliegen???

Ich gebe nemlich nie was frei... :oops:

Was für Daten müssen eigentlich wieder freigegeben werden?

Bei DLs VBOs und Texturen mache ich das (manchmal)!

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 24, 2005 13:36 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Prima geo! ;)

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'."


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 42 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]