Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Initialisiert New() den speicher mit #0? (https://www.delphipraxis.net/71542-initialisiert-new-den-speicher-mit-0-a.html)

SirThornberry 16. Jun 2006 17:30


Initialisiert New() den speicher mit #0?
 
Hallo,

mich würde interessieren ob "New()" den Speicher mit #0 initialisiert. Leider bin ich aus der Hilfe nicht schlau geworden.

Wenn ich mit New() Speicher für eine Record-Struktur anfordere wo auch Strings drin sind, kann ich dann einfach ZeroMemory auf diesen Speicher anwenden (wäre ja nur Nötig wenn New() den Speicher nicht mit #0 initialisiert)

Dax 16. Jun 2006 17:33

Re: Initialisiert New() den speicher mit #0?
 
New() holt meines Wissens einfach nur Speicher ran und füllt den nicht. Aber du könntest es schlimmstenfalls ausprobieren:
Delphi-Quellcode:
type
  PMyRec = ^MyRec;
  MyRec = record
    i: Integer;
  end;

p: PMyRec = nil;

repeat
  Dispose(p);
  New(p);
until p.i <> 0;

SirThornberry 16. Jun 2006 17:36

Re: Initialisiert New() den speicher mit #0?
 
ok, ich hab es ausprobiert und der speicher war nicht initialisiert. Wenn in dem Record strings wären würde das ja dann fatale auswirkungen haben wenn die nicht auf nil stehen :?

Basilikum 16. Jun 2006 17:53

Re: Initialisiert New() den speicher mit #0?
 
New initialisiert sehrwohl den Speicherbereich - allerdings nur wo notwendig.

New alloziert mit GetMem Speicher und initialisiert diesen mit Initialize():
Zitat:

Zitat von OH
Initialize simply zeros out the memory occupied by long strings, variants, and interfaces, causing long strings to be empty and variants and interfaces to be Unassigned.


SirThornberry 16. Jun 2006 18:23

Re: Initialisiert New() den speicher mit #0?
 
Was passiert dann wenn ich auf den Speicher ZeroMemory anwende obwohl Strings etc. drin sind? Oder auf welche Art und weise kann man das ganze noch mit #0 initialisieren?

himitsu 16. Jun 2006 19:31

Re: Initialisiert New() den speicher mit #0?
 
wenn du das am Anfang machst ... nichts.

Wenn du es machst, nachdem z.B. einem String Daten zugewiesen wurden, dann hast du ein MemoryLeak ... der Stringzeiger wäre dann NIL (=Leersting), aber die alten Daten würden noch existieren.


Also wenn du eh alles initialisieren willst, dann geht es am schnellsten, wenn du per GetMem den Speicher holst und dann mit ZeroMem über alles drübergehst.

Initialize geht zwar auch ZeroMem-artig über den "Record", aber es setzt nur da auf #0, wo z.B. ein String steht ... der Rest bleibt unberührt.


Also wenn du per erst New deinen Speicher allocierst und dann gleich per ZeroMem drübergehst passiert nichts, außer daß du Speicher doppelt initialisiert (auf #0 gesetzt) hast ... demnach sinnloser Weise Initialize aufgerufen wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 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