it-swarm.com.de

C++ Wie lösche ich eine Struktur?

Struktur, die ich erstellt habe:

   struct VideoSample
  { 
      const unsigned char * buffer;
      int len;
  };

   VideoSample * newVideoSample = new VideoSample;
   newVideoSample->buffer = buf;
   newVideoSample->len = size;

       //...

Wie lösche ich es jetzt?

11
Rella
delete newVideSample;

Dadurch wird jedoch kein Speicher freigegeben, den Sie newVideoSample->buffer zugewiesen haben - Sie müssen ihn explizit freigeben, bevor Sie ihn löschen.

//Free newVideSample->buffer if it was allocated using malloc
free((void*)(newVideSample->buffer));

//if it was created with new, use `delete` to free it
delete newVideSample->buffer;

//Now you can safely delete without leaking any memory
delete newVideSample;

Normalerweise wird diese Art der Freigabe in den Destruktor der Klasse geschrieben, so dass sie automatisch aufgerufen wird, wenn Sie das dynamisch erstellte Objekt delete.

Danke @steve, dass du es erwähnt hast :)

21
Amarghosh
delete newVideoSample;

Wenn sich die new und die delete jedoch im selben Kontext befinden, ist es wahrscheinlich besser, sie zu überspringen und stattdessen nur auf dem Stapel zu erstellen:

VideoSample newVideoSample = {buf, size};

In diesem Fall ist keine Bereinigung erforderlich.

7
aschepler

Sie suchen nach dem Schlüsselwort delete:

delete newVideoSample;
3
SLaks

delete newVideoSample;

Verwenden Sie jedoch einen intelligenten Zeiger , der den Speicher automatisch freigibt. Beispiel:

std::auto_ptr<VideoSample> newVideoSample(new VideoSample);
3
vitaut

Wenn Sie beabsichtigten, dass VideoSample sein Mitglied buffer freigibt, ist VideoSample eine fragile Klasse. Es kann nicht festgestellt werden, ob buf im Heap mithilfe von new[] oder malloc erstellt wurde oder ob es sich um die Adresse einer Variablen auf dem Stapel handelt.

2
dripfeed

In C++ entspricht eine Struktur genau einer Klasse, mit der Ausnahme, dass standardmäßig alles öffentlich ist, wobei eine Klasse standardmäßig privat ist. Eine Struktur kann also einen Destruktor haben und wird mit delete freigegeben.

2
robev

Sofern mir nichts fehlt, verwenden Sie einfach delete:

delete newVideoSample;
2
Justin Niessner

delete newVideoSample. In C++ ist struct dasselbe wie class, jedoch mit öffentlichen Standardfeldern.

2
Abyx

Benutze delete

VideoSample * newVideoSample = new VideoSample;
//.. stuffs

delete newVideoSample;

Es gibt auch eine Überladung d. H. delete[]

VideoSample * newVideoSample = new VideoSample[n];
//.. stuffs

delete [] newVideoSample;

In Modern C++ wird immer empfohlen, intelligente Zeiger zu verwenden. Möglicherweise möchten Sie boost::shared_ptr<T> aus der Boost-Bibliothek verwenden.

2
Prasoon Saurav

Zuordnen -> VideoSample * newVideoSample = new VideoSample;

Löschen -> newVideoSample löschen;

Wenn Sie das Objekt im selben Kontext löschen, ordnen Sie es besser nur dem Stapel zu. Wenn Sie es außerhalb des Kontexts löschen, vergessen Sie nicht, eine Referenz zu übergeben.

Und das Wichtigste: Löschen Sie nicht, wenn Sie den Prozess beenden möchten. Es ist sinnlos: P

1
djTeller

* * Du erstellst ein Objekt von Videosample, also benutze einfach delete ..

VideoSample * newVideoSample = new VideoSample; lösche newVideoSample; * *

0
Satyam