wie Pointer löschen

Gast #2167622
Lesenswert?

Hallo,

ich hab mal eine Frage bezüglich pointer.

Folgendes:

void foo()
{
   array_size = ...; // größe wird aus einer Datenbank ermittelt

   int[array_size]* x;
   x[0] = new int;
   x[1] = new int;
   x[2] = new int;
   ...
   ..

   x[0] = ...;

   return;
}

Wenn ich die Funktion verlasse möchte ich nicht das x zerstört wird. Was 
ich ja damit erreiche, dass ich kein delete [0], x[1], ..., mache.
Wenn ich die Funktion allerdings noch einmal aufrufe, dann möchte ich 
das der Speicher wieder freigegeben wird und neuer Speicher reserviert 
wird, da ich ja sonst bei ein paar millionen aufrufen ziemlich viel 
Speicher reservieren würde.
Wie kann ich dies am besten realisieren?
eventuell so:

int array_size = 0; // global speichern

{
   for (n=0; n<=0;n++)
      delete x[n];

   array_size = ...; // größe wird aus einer Datenbank ermittelt

   int[array_size]* x;
   x[0] = new int;
   x[1] = new int;
   x[2] = new int;
   ...
   ..

   x[0] = ...;

   return;


Gruß
matzunami
Gast #2167629
Lesenswert?

Da das Array auf dem Stack liegt und dieser mit dem Verlassen der 
Funktion aufgelöst wird, kannst du den Speicher nicht mehr freigeben.

Du könntest den Speicher aber als static deklarieren, damit er nicht auf 
dem Stack erzeugt wird. Dann kannst du diesen auch nachher freigeben. 
Aber du musst die Adressen auf Gültigkeit prüfen. Wenn du die Funktion 
nämlich das erste Mal aufrufst, sind ja noch keine gültigen Zeiger im 
Array.
Gast #2168537
Lesenswert?

matzunami schrieb:
> int[array_size]* x;

Das müßte eher so heißen:
1
int* x[array_size];

>    x[0] = new int;
>    x[1] = new int;
>    x[2] = new int;

Warum willst du jeden int einzeln dynamisch erzeugen? Mach doch gleich 
ein Array aus int.

> Wenn ich die Funktion verlasse möchte ich nicht das x zerstört wird.

Warum nicht? Du kannst doch sowieso nicht drauf zugreifen.

Kann es sein, daß du eigentlich was anderes tun willst, als du hier 
schreibst?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren