AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C++: Zeiger und Speicher reservieren
Thema durchsuchen
Ansicht
Themen-Optionen

C++: Zeiger und Speicher reservieren

Ein Thema von PAX · begonnen am 14. Okt 2006 · letzter Beitrag vom 15. Okt 2006
Antwort Antwort
Benutzerbild von PAX
PAX

Registriert seit: 22. Jun 2003
Ort: Karlsruhe
88 Beiträge
 
Delphi 7 Personal
 
#1

C++: Zeiger und Speicher reservieren

  Alt 14. Okt 2006, 15:51
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!
Andreas
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner

  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#2

Re: C++: Zeiger und Speicher reservieren

  Alt 14. Okt 2006, 17:03
pax tecum
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von PAX
PAX

Registriert seit: 22. Jun 2003
Ort: Karlsruhe
88 Beiträge
 
Delphi 7 Personal
 
#3

Re: C++: Zeiger und Speicher reservieren

  Alt 14. Okt 2006, 19:01
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!


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?

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)...
Andreas
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner

  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#4

Re: C++: Zeiger und Speicher reservieren

  Alt 14. Okt 2006, 20:38
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!
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?
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)...
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: C++: Zeiger und Speicher reservieren

  Alt 14. Okt 2006, 20:55
Hallo,
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 .
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?
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von PAX
PAX

Registriert seit: 22. Jun 2003
Ort: Karlsruhe
88 Beiträge
 
Delphi 7 Personal
 
#6

Re: C++: Zeiger und Speicher reservieren

  Alt 15. Okt 2006, 11:57
Zitat von xaromz:
Doch, Windows räumt hinter Dir auf. Schön ist es trotzdem nicht .



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

einen wunderschönenen und produktiven tag wünsche ich euch zwei noch
Andreas
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner

  Mit Zitat antworten Zitat
Antwort Antwort


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 01:08 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