web-dev-qa-db-fra.com

C++ comment supprimer une structure?

Structure que j'ai créée:

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

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

       //...

Comment maintenant le supprimer maintenant?

11
Rella
delete newVideSample;

Cela ne libérera cependant pas la mémoire que vous avez allouée à newVideoSample->buffer - vous devez la libérer explicitement avant de la supprimer.

//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;

Normalement, ce type de libération est écrit dans le destructor de la classe, de sorte qu'il sera appelé automatiquement lorsque vous delete l'objet créé de manière dynamique.

Merci @steve de le mentionner :)

21
Amarghosh
delete newVideoSample;

Mais si les variables new et delete se trouvent dans le même contexte, vous feriez probablement mieux de les ignorer et de simplement les créer sur la pile:

VideoSample newVideoSample = {buf, size};

Dans ce cas, aucun nettoyage n'est nécessaire.

7
aschepler

Vous recherchez le mot clé delete:

delete newVideoSample;
3
SLaks

delete newVideoSample;

Cependant, envisagez d'utiliser un pointeur intelligent qui libérera automatiquement la mémoire, par exemple:

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

Si vous vouliez que VideoSample libère son membre buffer, VideoSample est une classe fragile. Il est impossible de savoir si buf a été créé dans le segment de mémoire à l'aide de new[] ou malloc, ou s'il s'agit de l'adresse d'une variable de la pile.

2
dripfeed

En C++, une structure est identique à une classe, sauf que tout est public par défaut, où une classe est privée par défaut. Ainsi, une structure peut avoir un destructeur et est libérée avec delete.

2
robev

À moins que quelque chose me manque, vous utilisez simplement delete:

delete newVideoSample;
2
Justin Niessner

delete newVideoSample. En C++, struct est identique à class mais avec des champs publics par défaut.

2
Abyx

Utilisez delete

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

delete newVideoSample;

Il y a aussi une surcharge i.e delete[]

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

delete [] newVideoSample;

Dans Modern C++, il est toujours recommandé d'utiliser des pointeurs intelligents. Vous voudrez peut-être utiliser boost::shared_ptr<T> de la bibliothèque boost.

2
Prasoon Saurav

Pour allouer -> VideoSample * newVideoSample = new VideoSample;

Pour supprimer -> supprimer newVideoSample;

Si vous supprimez l'objet dans le même contexte, vous feriez mieux de l'allouer sur la pile. Si vous le supprimez en dehors du contexte, n'oubliez pas de transmettre une référence.

Et surtout, ne supprimez pas si vous êtes sur le point de quitter le processus, cela ne sert à rien: P

1
djTeller

* * Vous créez un objet de Videosample, il vous suffit donc d'utiliser delete.

VideoSample * newVideoSample = new VideoSample; supprimer newVideoSample; * *

0
Satyam