AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Probleme mit Data (Pointer)

Offene Frage von "Chatfix"
Ein Thema von ranftl · begonnen am 22. Mai 2006 · letzter Beitrag vom 26. Feb 2007
Antwort Antwort
Seite 3 von 4     123 4   
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#21

Re: Probleme mit Data (Pointer)

  Alt 25. Feb 2007, 15:57
Und um alles noch mal zusammen zu fassen:

Dispose() braucht einen typisierten Pointer, damit es weiß, wie viel Speicher es freigeben muss. (Auf Delphisch: Dispose(PString(Datta); )

Enthält der Pointer lange Strings, Variant-Werte oder Interfaces, muss vorher ein Finalize gemacht werden. Vorsorglichg kann man das immer voranstellen, denn ...
Zitat von ... die Delphi-Hilfe ©Borland:
Enthält die als Parameter an Finalize übergebene Variable keine langen Strings, Varianten oder Schnittstelle entfernt der Compiler den Aufruf und generiert keinen Code.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von Chatfix
Chatfix

Registriert seit: 10. Dez 2003
Ort: Schneeberg
39 Beiträge
 
#22

Re: Probleme mit Data (Pointer)

  Alt 25. Feb 2007, 22:08
Nun bin ich verwirrt?!
Was ist denn nun richtig?
Muss ich unbedingt einen record anlegen um einen einzigen String im ListItem.Data zu hinterlegen?

Über ein Stück Code (nicht mal eben ausm Kopf sondern so richtig durchdacht) vom schreiben ins Data-"Feld" bis hin zum auslesen und dann zum freigeben, würde ich mich sehr freuen. Am betsen alles in verschiedenen Prozeduren.

Vielen Dank im vorraus!
Marcel Kukelka
MfG Chatfix
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#23

Re: Probleme mit Data (Pointer)

  Alt 26. Feb 2007, 00:36
Zitat von chaosben:
Dispose() braucht einen typisierten Pointer, damit es weiß, wie viel Speicher es freigeben muss. (Auf Delphisch: Dispose(PString(Datta); )
Sicher? Weil das reine Freigeben des Speichers sollte doch anhand des Pointer so klappen, schliesslich weiss der Speichermanager mit der Pointeradresse, wie gross dieser Block ist. Der Typ sollte doch nur für das Finalize gebraucht werden.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#24

Re: Probleme mit Data (Pointer)

  Alt 26. Feb 2007, 05:13
Hey Thomas,
du machst mich ja ganz kirre. Weiter oben schreibst du:
Zitat von Muetze1:
dann sollte Dispose auch den richtigen Zeigertyp bekommen, damit er denn finalisieren kann, sonst fehlt auch ihm das Wissen über den Typ der Struktur. Dieses wird vom Speichermanager nicht abgelegt
Und hier unten fragst du genau danach.

Aber damit wir das Problem endlich lösen können, werd ich mal sehen, obs irgendwo etwas schriftliches dazu gibt.

Edit:
In der BDS4-Referenz hab ich folgendes gefunden:
Zitat von Borland:
Memory manager blocks are always rounded upward to a 4-byte boundary, and always include a 4-byte header in which the size of the block and other status bits are stored. This means that memory manager blocks are always double-word-aligned, which guarantees optimal CPU performance when addressing the block.
Scheinbar braucht man den untypisierten Pointer also nicht casten.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von Chatfix
Chatfix

Registriert seit: 10. Dez 2003
Ort: Schneeberg
39 Beiträge
 
#25

Re: Probleme mit Data (Pointer)

  Alt 26. Feb 2007, 07:12
Jetzt weis ich trotzdem noch nicht so recht welche Schritte ich in welcher Reihenfolge ausführen muss
Marcel Kukelka
MfG Chatfix
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#26

Re: Probleme mit Data (Pointer)

  Alt 26. Feb 2007, 08:38
Zitat von chaosben:
Hey Thomas,
du machst mich ja ganz kirre.
Genau lesen! Ich habe folgendes aus der bisherigen Diskussion von euch gelernt:

1. mit Dispose() freigegebene Dinge braucht man nicht mit Finalize bearbeiten (wurde zuvor behauptet, wurde nicht widersprochen)
2. Finalize() braucht den richtigen Typ um zu arbeiten, damit er die Struktur ordentlich abräumen kann.
3. Dispose() würde mit einem untypisierten Pointer noch immer den Speicher ordentlich freigeben. Er kann dann aber nicht die internen, aktiven Elemente abräumen (Finalize)
4. Dispose() würde mit einem typisierten Pointer ein Finalize (siehe Punkt 1) mit enthalten und dann den Speicher freigeben.

Somit, habe ich mit der Frage zuvor folgendes klären wollen: Wenn man das Finalize() vor dem Dispose selbst aufruft (Finalize braucht immer den genauen Typ), dann kann man Dispose() mit einem untypisierten Pointer aufrufen. Denn: den typisierten Pointer braucht Dispose() nur, wenn man vorher kein Finalize() gemacht hat, und somit Dispose() dies mit macht. Diese Behauptung stützt sich auf den 1. Punkt.

Ich habe in der vorherigen Frage nur noch mal nachgehakt, da Dispose() den alloziierten Speicherbereich immer freigeben kann - dafür braucht er keinen typisierten Pointer. Das wollte ich nochmal genau nachfragen. Wenn man das Finalize() aber Dispose() mit überlassen will, dann muss der richtige Typ beim Aufruf angegeben werden.

Dispose() hat als Gegenstück zu New() augenscheinlich nur die Hauptaufgabe Speicher zu alloziieren und zu dealloziieren. New() braucht dabei immer einen Typ, da er sich daraus die Grösse des alloziierenden Speichers ableitet. Dispose() braucht sich diese Grösse nicht mehr neu abzuleiten aus dem Typ, da sie vom Speichermanager hinterlegt wurde bei der Alloziierung. New() macht grundsätzlich ein Initialize(), wenn solche o.g. aktiven Typen enthalten sind. Dispose kümmert sich vor dem freigeben entsprechend um das Finalize() - und genau dafür braucht er den Typ - für das reine freigeben des alloziierten Speichers nicht.

Initialize() und Finalize() werden benötigt, wenn man aktive Typen in z.B. einer Struktur hat, welche nicht mit den intelligenten Funktionen New()/Dispose() verwaltet werden, sondern z.B. über AllocMem(), GetMem(), etc und deren Gegenstücke.

Jetzt klarer? Bzw. kannst du mir nun nochmal bitte meine Frage vom Beitrag zuvor entweder bestätigr oder entsprechend korrigieren?
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#27

Re: Probleme mit Data (Pointer)

  Alt 26. Feb 2007, 09:10
So, ich komme nach einem weiteren Studium der Hilfe zu folgendem Schluss:
  • New() und Dispose() gehören zu einer Gruppe und Initialize(), Finalize, GetMem() und FreeMem() bilden die andere Gruppe. Man sollte die beiden Gruppen imho nicht mischen.
  • New() ersetzt die Kombination aus GetMem() und Initialize() - Dispose() ersetzt Finalize() und FreeMem().
  • Dispose() braucht keinen typisierten Pointer. (weil: siehe oben)

Ist jetzt damit alles geklärt?

PS: Sorry, wenn ich nicht richtig gelesen habe.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#28

Re: Probleme mit Data (Pointer)

  Alt 26. Feb 2007, 10:49
Zitat von chaosben:
PS: Sorry, wenn ich nicht richtig gelesen habe.
Kein Problem, Hauptsache wir bekommen es richtig hin, und es steht was richtiges für die Nachwelt hier im Forum.

Zitat von chaosben:
Ist jetzt damit alles geklärt?
Nein, leider nicht. Und zwar zu dieser Aussage:

Zitat von chaosben:
  • Dispose() braucht keinen typisierten Pointer. (weil: siehe oben)
Ich bin zuvor ja zu dem Schluss gekommen, dass New() und Dispose() ein Intialize() und Finalize() übernehmen/mitmachen und somit müsste Dispose() einen typisierten Pointer bekommen, damit er dieses Finalize machen kann. Dispose() kenn mit der Adresse die Grösse, aber nicht den Typ.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#29

Re: Probleme mit Data (Pointer)

  Alt 26. Feb 2007, 11:40
Ich glaub jetzt hab ichs:
  • Das was ich oben über die 2 Gruppen geschrieben habe ist falsch. Dispose kapselt nämlich Finalize und FreeMem.
    Delphi-Quellcode:
    procedure _Dispose(p: Pointer; typeInfo: Pointer);
    begin
      _Finalize(p, typeinfo);
      FreeMem(p);
    end;
  • Der Praxistest hat gezeigt: Man muss an Dispose einen typisierten Pointer übergeben.

@Chatfix: Du bekommst deine Antwort noch. Einen kleinen Moment bitte.
Angehängte Dateien
Dateityp: zip chatfix_182.zip (2,8 KB, 9x aufgerufen)
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#30

Re: Probleme mit Data (Pointer)

  Alt 26. Feb 2007, 12:10
So, genau. Somit bin ich auch zufrieden, weil genau das war mein Wissensstand und somit bin ich froh, dass es richtig ist. Danke für's klären...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf