Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Funktionsweise der internen Speicherverwaltung von Hochsprachen ?

3 views
Skip to first unread message

Jaromir Prinzler

unread,
Nov 29, 2010, 5:20:58 AM11/29/10
to
Hallo !

Ich habe eine (natürlich mehrere) Funktion oder Methode (bei Objekten)
welche mir einen Speicherbereich
allokiert und mir den Adresszeiger darauf zurück gibt. Beispielsweise wenn
ich einen String zurecht trimme
(Leerzeichen entfernen) oder wenn ich eine Struktur anfordere.

Jetzt verwende ich ein Adressfeld mit endlicher Größe (32648 Zeiger) in
welchem diese temporären
Speicherbereiche vermerkt werden. Diese werden automatisch beim Programmende
wieder frei gegeben.

Da die Anzahl der Adresszeiger aber endlich ist, werden irgendwann wieder
die ersten Speicherplätze
benutzt da diese wohl (und hoffentlich) inzwischen nicht mehr innerhalb des
Programmes genutzt werden.

Soweit funktioniert es so auch, aber wie läuft es richtig?

Wenn ich in einer Programmiersprache z.B. Trim(char *) oder SubStr(char *)
nutze wird ja nicht der
Original Zeiger zurück gegeben, sondern ein interner mit dem entsprechend
geänderten Inhalt.

Wie kann ich oder der Compiler den nun heraus finden wann ein interner
Zeiger wirklich nicht mehr benötigt wird?

Sicherlich kann ich mittels malloc und free selbst arbeiten, aber dann wären
verschachtelte Aufrufe wie...

char *pszOriginal = "Jaromir";
char *pszCopy = LeftStr(RightStr(pszOriginal, 5), 3);

printf("%s %s\n", pszOriginal, pszCopy);

ergibt

Jaromir rom

...nicht möglich, da ich den Rückgabewert von "RightStr" nicht kenne (kennen
will).

Habt Ihr eine Idee ? Danke für die Tipps!

Grüße aus Berlin

Jaro


Frank Buss

unread,
Nov 29, 2010, 6:53:01 AM11/29/10
to
Jaromir Prinzler wrote:

> Wie kann ich oder der Compiler den nun heraus finden wann ein interner
> Zeiger wirklich nicht mehr benötigt wird?

Z.B. in Java, und funktionalen Sprachen wie Haskell, wird dazu ein Garbage
Collector verwendet.

> Sicherlich kann ich mittels malloc und free selbst arbeiten, aber dann wären
> verschachtelte Aufrufe wie...
>
> char *pszOriginal = "Jaromir";
> char *pszCopy = LeftStr(RightStr(pszOriginal, 5), 3);
>
> printf("%s %s\n", pszOriginal, pszCopy);
>
> ergibt
>
> Jaromir rom
>
> ...nicht möglich, da ich den Rückgabewert von "RightStr" nicht kenne (kennen
> will).
>
> Habt Ihr eine Idee ? Danke für die Tipps!

In C++ kannst du das mit der std::string-Klasse machen. Da das keine
Pointer sind, sondern "automatische" Objekte (die also für lokale Variablen
auf dem Stack liegen), wird der interne char* automatisch bei verlassen des
Kontextes gelöscht. Außerdem kümmert sich die string-Klasse um alle Fälle,
wenn man einen String einem anderen zuweist usw. Speicherlöcher sind damit
dann nicht mehr möglich.

#include <string>
#include <iostream>

using namespace std;

string rightStr(string str, int c)
{
return str.substr(str.size() - c, c);
}

string leftStr(string str, int c)
{
return str.substr(0, c);
}

int main(int argc, char** argv)
{
string original = "Jaromir";
string copy = leftStr(rightStr(original, 5), 3);
cout << original << " " << copy << endl;
return 0;
}

--
Frank Buss, http://www.frank-buss.de
piano and more: http://www.youtube.com/user/frankbuss

Jaromir Prinzler

unread,
Nov 29, 2010, 7:41:23 AM11/29/10
to
> In C++ kannst du das mit der std::string-Klasse machen. Da das keine

Okay soweit verstanden. Aber es gibt ja nun nicht nur Strings, sondern auch
noch beliebige Strukturen o.ä. ?
Irgendwie muss es doch auch ohne Objekte funktionieren ? Beispielsweise in
simplen C oder PHP ?

Jaro


Frank Buss

unread,
Nov 29, 2010, 7:56:48 AM11/29/10
to
Jaromir Prinzler wrote:

> Okay soweit verstanden. Aber es gibt ja nun nicht nur Strings, sondern auch
> noch beliebige Strukturen o.ä. ?
> Irgendwie muss es doch auch ohne Objekte funktionieren ? Beispielsweise in
> simplen C oder PHP ?

Nein, in C geht das nicht anders, denn C ist ja nicht viel mehr als ein
glorifizierter Makro-Assembler :-) Mit etwas mehr Syntax und
Zusatzlibraries wie dem Boehm-GC (
http://www.hpl.hp.com/personal/Hans_Boehm/gc/ ) wird es aber schon etwas
besser.

PHP hat einen GC eingebaut.

Jaromir Prinzler

unread,
Nov 30, 2010, 5:20:50 AM11/30/10
to
Ist zwar nun wieder Systembezifisch, aber evtl. gibt es ja noch diese
Variante unter Windows API ?

Kann man mittels "HeapCreate" einen programminternen Heap anlegen und
auf diesem mittels "HeapAlloc(HANDLE, HEAP_ZERO_MEMORY, ldBytes);"
fleissig Speicher anfordern ?

Am Ende des Programmes gebe ich dann alles durch "HeapDestroy(HANDLE)"
wieder frei ?

..Jaro


0 new messages