Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++: Zeiger und Speicher reservieren (https://www.delphipraxis.net/79004-c-zeiger-und-speicher-reservieren.html)

PAX 14. Okt 2006 14:51


C++: Zeiger und Speicher reservieren
 
grüßt gott!

ich habe einige grundlegende fragen zu c++builder, welche sich mir inzwischen stellten.

zu den zeigern:

wenn ich speicher für einen zeiger reserviere, muss ich ihn nachher wieder (in c++ mit delete) freigeben, da dies nach rückkehr aus der funktion nicht automatisch geschieht und sonst speicherlücken entstehen. was ist jedoch eigentlich, wenn das gesamte programm beendet wird, erfolgt dann auch eine freigabe von eventuellen speicherlücken? über diesen zusammenhang bin ich mir noch im unklaren.

zu speziellen datentypen:

in c++ gibts neben den char-arrays auch noch den typ "ansistring". in der hilfe stand darüber:
"Die maximale Länge der Strings ist nur vom verfügbaren Speicher abhängig.
Optimale Speichernutzung durch gemeinsame Referenzen."
was bedeutet dies nun. wenn ich nun einen ansistring ohne startwert deklariere, wird dann bereits schon speicherplatz reserviert, oder erst bei einer wertzuweisung? wenn dieser datentyp wirklich so lange zeichketten aufnehmen kann, dann wäre doch kein speicher mehr vorhanden, wenn für ihn der gesamte heap reserviert wird? also wie funktioniert das nun; "wie viel" byte wird reserviert und "wann" erfolgt das?

genau die gleiche frage in grün zum typ "unsigned long long". deklariere ich einen bezeichner von diesem typ, wird dann sofort 8 byte vom heap in anspruch genommen?
wovon hängt eigentlich die gesamtgröße des freien heaps ab? gibts eine möglichkeit, diese zu ermitteln?


ich bedanke mich für eure eventuelle zeitinvestition in meine fragen :)


viva los tioz!

r2c2 14. Okt 2006 16:03

Re: C++: Zeiger und Speicher reservieren
 
pax tecum :hi:
SCNR

Kann man eigentlich relativ kurz zusammenfassen:
- Was du mit new an Speicher reservierst, musst du mit delete wieder freigeben. Automatisch passiert da nix.
- Was du mit Create erzeugst, musst du mit Free wieder freigeben. Ausnahmen bestätigen die Regel.
- AnsiStrings sind intern Pointer auf n Heap. Dort liegt dann n String, der IMHO theoretisch den gesamten Heap ausfüllen kann(2GB).
- AnsiStrings verwaltet Delphi/C++Builder für dich
- Der Heap is nur n "imaginäres Gebilde". Jeder Prozess is überzeugt davon, dass er 2GB zur Verfügung hat. Das Zusammenspiel regelt Windows(bzw. genauer: der MemoryManager).

Wenn ich Mist erzählt haben sollte, korrigiert mich...

mfg

Christian

PAX 14. Okt 2006 18:01

Re: C++: Zeiger und Speicher reservieren
 
namaste, r2c2!
zunächst erstmal, danke für die antwort! :)

Zitat:

Was du mit new an Speicher reservierst, musst du mit delete wieder freigeben. Automatisch passiert da nix.
das heißt, wenn ich die freigabe vergesse und das programm irgendwann beendet wird, dann "bleibt" diese speicherlücke bis zum computerneustart?

Zitat:

Jeder Prozess is überzeugt davon, dass er 2GB zur Verfügung hat. Das Zusammenspiel regelt Windows(bzw. genauer: der MemoryManager).
achso, und falls der arbeitsspeicher nicht ausreichen sollte, wird auf den virtuellen speicher (auslagerungsdatei) zurückgegriffen, gell? und falls dieser nicht ausreicht, ... ja dann is es nich meine schuld! :mrgreen: :zwinker:


und nochmal zum ansistring: wenn ich solch einem bezeichner nun eine 23 byte-zeichenkette zuweise, wie viel byte wird dann verbraucht? 23 oder dann doch mehr? :freak:

der grund, warum ich solche fragen stelle ist, dass ich wissen möchte, was genau vorgeht und wie stark ich mein programm somit verhunze, wenn ich mehrere ansistrings und unsigned long long-typen deklariere(n muss)... :nerd:

r2c2 14. Okt 2006 19:38

Re: C++: Zeiger und Speicher reservieren
 
Zitat:

Zitat von PAX
das heißt, wenn ich die freigabe vergesse und das programm irgendwann beendet wird, dann "bleibt" diese speicherlücke bis zum computerneustart?

So ungefähr jo. Kann sein, dass Windows da irgendwann nochmal aufräumt, aber davon sollte man nicht ausgehen...

Zitat:

achso, und falls der arbeitsspeicher nicht ausreichen sollte, wird auf den virtuellen speicher (auslagerungsdatei) zurückgegriffen, gell? und falls dieser nicht ausreicht, ... ja dann is es nich meine schuld! :mrgreen: :zwinker:
Jo.

Zitat:

und nochmal zum ansistring: wenn ich solch einem bezeichner nun eine 23 byte-zeichenkette zuweise, wie viel byte wird dann verbraucht? 23 oder dann doch mehr? :freak:
23 Byte Daten + 4 Byte Pointer + ? Byte Referenzzählung

Zitat:

der grund, warum ich solche fragen stelle ist, dass ich wissen möchte, was genau vorgeht und wie stark ich mein programm somit verhunze, wenn ich mehrere ansistrings und unsigned long long-typen deklariere(n muss)... :nerd:
AnsiStrings(bzw. Strings in Delphi) kannst du im Prinzip so viele nutzen, wie du lustig bist. Mach dir da gar keine Gedanken. Die Zeiten, wo man wirklich auf jedes Byte RAM aufpassen musste sind (zumindest für die Windows-Entwicklung) nun endgültig vorbei... Bevor du darüber nachdenkst ob du hier Speicher sparen kannst, hast du die komplette VCL umgeschrieben...
Auch bei unsigned long long(~ Int64 in Delphi) brauchst du dir da keine Gedanken machen. Wobei man die sowieso extrem selten braucht...

Der Einzige Grund warum man sich darüber Gedanken machen kann, is Geschwindigkeit. (Ansi)Strings sind etwas langsamer als PChar bzw. char *. Wenn du ne Funktion hast, die n paar Tausend Mal aufgerufen wird, kannst du dir überlegen, ob du das nicht schneller hinkriegst, ansonsten brauchst du dir da auch keine Gedanken machen...

mfg

Christian

xaromz 14. Okt 2006 19:55

Re: C++: Zeiger und Speicher reservieren
 
Hallo,
Zitat:

Zitat von r2c2
So ungefähr jo. Kann sein, dass Windows da irgendwann nochmal aufräumt, aber davon sollte man nicht ausgehen...

Doch, Windows räumt hinter Dir auf. Schön ist es trotzdem nicht :wink: .
Zitat:

Zitat von r2c2
Zitat:

und nochmal zum ansistring: wenn ich solch einem bezeichner nun eine 23 byte-zeichenkette zuweise, wie viel byte wird dann verbraucht? 23 oder dann doch mehr? :freak:
23 Byte Daten + 4 Byte Pointer + ? Byte Referenzzählung

IMHO 23 Byte Daten + 4 Byte Pointer + 4 Byte Referenzzählung + 1 Byte Nullterminierung. Macht zusammen 32 Byte.

Gruß
xaromz

PAX 15. Okt 2006 10:57

Re: C++: Zeiger und Speicher reservieren
 
Zitat:

Zitat von xaromz
Doch, Windows räumt hinter Dir auf. Schön ist es trotzdem nicht :wink: .

:mrgreen: :angel: :zwinker:


gut, ich danke euch beiden, ihr habt meine fragen beseitigt :xmas:

einen wunderschönenen und produktiven tag wünsche ich euch zwei noch :)


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