AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi GetMem / FreeMem - New / Dispose
Thema durchsuchen
Ansicht
Themen-Optionen

GetMem / FreeMem - New / Dispose

Ein Thema von AJ_Oldendorf · begonnen am 8. Jun 2012 · letzter Beitrag vom 12. Jun 2012
Antwort Antwort
Seite 1 von 2  1 2      
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#1

GetMem / FreeMem - New / Dispose

  Alt 8. Jun 2012, 10:10
Hallo zusammen,
ich weiß, dass GetMem und FreeMem sowie New und Dispose zusammen gehören.
Mal ne "dumme" Frage, was würde passieren, wenn ich mit New Speicher reserviere und mit FreeMem diesen freigeben würde?

Gruß
Alex
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

AW: GetMem / FreeMem - New / Dispose

  Alt 8. Jun 2012, 10:19
Grundsätzlich erstmal nichts, aber New und Dispose beachten die RTTI.

z.B. wenn du einen Record in dem "Pointer hat, welcher z.B. "lange" Strings enthält, dann würde Dispose diesen String freigeben, während FreeMem das nicht macht.

Also besser immer nur die zusammengehörigen Funktionen zusammen benutzen.




New = GetMem + Initialize/InitializeRecord
Dispose = Finallize/FinallizeRecord + FreeMem

Tipp: Schau doch einfach mal in deine System.pas rein.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#3

AW: GetMem / FreeMem - New / Dispose

  Alt 8. Jun 2012, 10:27
Ok danke.

Das heißt, wenn ich folgenden Record habe, würde FreeMem den String nicht richtig freigeben?

Delphi-Quellcode:
TData = packed record
    a: LongWord;
    b: String[40];
    c: TDateTime;
  end;
Gruß
Alex
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: GetMem / FreeMem - New / Dispose

  Alt 8. Jun 2012, 10:29
Wo ist da der LANGE String?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#5

AW: GetMem / FreeMem - New / Dispose

  Alt 8. Jun 2012, 10:31
Nein, den würde es freigeben.
DAS ist ein "kurzer" String.

String[123] = Delphi-Referenz durchsuchenShortString mit besimmter maximaler Länge ( MaxLen <= 255 )
String = Delphi-Referenz durchsuchenAnsiString, bzw. Delphi-Referenz durchsuchenUnicodeString, was beides Long-Strings sind.
WideString = WideString, was ein OLE-Wrapper um MSDN-Library durchsuchenSysAllocStringLen und seine Freunde
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#6

AW: GetMem / FreeMem - New / Dispose

  Alt 8. Jun 2012, 10:55
Ok, wusste nicht genau, was du mit "lange" Strings meinst

Also würde bei New und FreeMem (mit richtiger Größenangabe) eigentlich nichts passieren bei dem geposteten Record?

Gruß
Alex
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: GetMem / FreeMem - New / Dispose

  Alt 8. Jun 2012, 11:00
Ich würde es etwas anders formulieren:

Benutze nur New/Dispose, es sei denn es ist nicht zu umgehen und Du weißt was Du tust, dann benutze Getmem/Freemem.

Die andere Ausnahme ist, wenn Du Wert auf vollkommen unerklärlich Fehler legst, da ist Getmem/Freemem wunderbar für geeignet.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#8

AW: GetMem / FreeMem - New / Dispose

  Alt 8. Jun 2012, 11:50
Jupp.

FreeMem neigt eventuell zu Speicherlecks, da ja nur der Pointer selber freigegeben wird, aber nichts, was darin eventuell verlinkt wurde.
Und auf GetMem folgen eventuell unerklärliche gemeine und eigentlich erklärliche Fehler, wenn gewisse Dinge nicht ordnungsgemäß initialisiert wurden.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#9

AW: GetMem / FreeMem - New / Dispose

  Alt 8. Jun 2012, 11:51
Zitat:
Die andere Ausnahme ist, wenn Du Wert auf vollkommen unerklärlich Fehler legst, da ist Getmem/Freemem wunderbar für geeignet
Jetzt würde mich aber wirklich mal interessieren, was du mit unerklärlichen Fehlern meinst wenn man GetMem und FreeMem benutzt?

Gruß
Alex
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#10

AW: GetMem / FreeMem - New / Dispose

  Alt 8. Jun 2012, 11:56
"lange" Stringvariablen, Interfaces, Variants und dynamische Arrays müssen initialisiert sein, sonst knallt die automatische Speicherverwaltung.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz