# [C++] Struct neu initialisieren & Speicher freigeben



## Ezzz (31. Oktober 2003)

Hallo!

Ich habe folgendes Problem:
Ich nutze diesen struct und initialisiere in der Header-Datei einen darauf basierenden Typ. Nun möchte ich zur Laufzeit der Klasse den kompletten struct bzw. den Typ wieder so zurücksetzen, das der Speicher wieder komplett freigegeben wird und keine Informationen mehr in den structs sind.


```
struct SpElement 
{string urlname; class ListEl *outptr; class ListEl *inptr; };
...
define MAX = 100000
...
class Klasse
{
private SpElement vek[MAX]
...

In dem konkreten Fall wird also der string urlname auf NULL gesetzt. Aber was mache ich mit den Pointern? Ich hatte mir das so vorgestellt:

	for (long i = 0; i<MAX; i++)
	{
		vek[i].urlname="";
		vek[i].inptr=NULL;
		vek[i].outptr=NULL;
	}
```

Das funktioniert aber leider nicht. Zum einen bleiben die Pointer bestehen und zeigen nicht "ins leere", zum anderen wird kein Speicher freigegeben, im Gegenteil. Laut dem taskmanager steigt der Speicherbedarf.

Wie ihr an der Frage sehen könnt, bin ich noch ein ziemlicher Anfänger...
Wahrscheinlich hab ich irgendwo einen Denkfehler.
Schon mal vielen Dank,
Grüße Ezzz


----------



## chibisuke (31. Oktober 2003)

Also der code ist ziemlich lückenhaft so wie du ihn da zeigst...

aber trotzdem ein paar dinge vorweg...

1.)wenn speicher dynamisch alloziert wird (mit NEW) dann muss dieser mit DELETE gelöscht werden..

2.) ein array mit 1000 einträgen von so einer größe wo noch string elemente dabei sind, die pointer machen fast nix aus dabei.. auf dem stack anzulegen ist nicht klug.. so etwas gehöhrt auf den heap...

3.) mach am besten eine klasse auf der struktur und schreib einen destruktor, dann macht der destruktor die drecksarbeit...

also prinziell würd ich das so aufbauen:

```
class MyData {
    MyData();
    ~MyData();
    string urlname; 
    class ListEl *outptr; 
    class ListEl *inptr; 
};

MyData::MyData() {
    this->urlname = NULL;
    this->outptr = NULL;
    this->ListEl = NULL;
}

MyData::~MyData() {
    this->urlname = NULL;
    delete this->outptr;
    this->outptr = NULL;
    delete this->inptr;
    this->outptr = NULL;
}
```
aber wenn dus von außerhalb haben willst wies is, musst du den code der in dem destruktor ist, in eine schleife packen die du dann ausführst..


----------



## Ezzz (1. November 2003)

Hallo!

Auf die Möglichkeit hätte ich eigentlich auch selber kommen können 
Ich werde das jetzt mal umprogrammieren. Wieso ist es denn unklug, so große Sachen auf den Stack zu legen? 

Vielen Dank für die schnelle Antwort,
Grüße,
Ezzz


----------



## chibisuke (1. November 2003)

Weil der stack ein statisch definierter speicherbereich ist, und der compiler festlegen muss wie viel speicher für den stack reserviert wird. Wenn der Compiler nicht genug stack speicher reserviert, kommts zum stack-overflow, was dein programm zum absturz bringt und das sind fehler die sind ganz schwer zu finden.

Bei Windows programmen stürzt das programm "nur" ab.
Bei DOS programmen hingegen überschreibt der stack den programmcode, was zu total unerwarteten operationen führen kann, und sogar im schlimsten fall sogar zu datenverlust führen kann.

Um das zu vermeiden, legt man alle größeren datenmengen auf dem heap an, außer es gibt triftige gründe dagegen. 

Prinziell merk dir, datenstrukturn die über 1KB größe ergeben würden, gehöhren auf keinen fall auf den stack.
Außerdem gehöhren instanzen also objekte die aus klassen gebildet wurden, prinziell auf den Heap.


----------

