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?
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 :)
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.
Vous recherchez le mot clé delete
:
delete newVideoSample;
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);
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.
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.
À moins que quelque chose me manque, vous utilisez simplement delete
:
delete newVideoSample;
delete newVideoSample
. En C++, struct
est identique à class
mais avec des champs publics par défaut.
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.
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
* * Vous créez un objet de Videosample, il vous suffit donc d'utiliser delete.
VideoSample * newVideoSample = new VideoSample; supprimer newVideoSample; * *