2010-11-09 13 views
8

Estructura I creó:C++ ¿cómo eliminar una estructura?

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

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

     //... 

Cómo ahora para eliminar ahora?

+1

¿A quién pertenece el * buffer *? Las probabilidades no son cero que también necesitas un destructor. –

Respuesta

20
delete newVideSample; 

Esto no va a liberar cualquier memoria que asignado a newVideoSample->buffer sin embargo, debe liberarlo explícitamente antes de eliminarlo.

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

Normalmente este tipo de liberación está escrito en el destructor de la clase de modo que será llamado automáticamente cuando delete el objeto creado dinámicamente.

Gracias @steve por mencionar it :)

+0

me da C2664 gratis (newVideSample-> buffer); línea. algo así como no puede convertir const unsigned char en void * – Rella

+1

Esto merece un -1 - para el uso de 'free' sin saber de dónde viene la memoria, y para no recomendar esto se debe hacer en destructor si se establece el puntero. No downvoting, porque ninguna otra respuesta incluso menciona esto. –

+0

Gracias @Steve, actualicé la publicación. – Amarghosh

3

Usted está buscando la palabra clave delete:

delete newVideoSample; 
2

A menos que me falta algo, sólo tiene que utilizar delete:

delete newVideoSample; 
7
delete newVideoSample; 

Pero si el new y delete se encuentran en el mismo contexto, que es probablemente mejor de ellos y omitiendo sólo la creación en la pila en su lugar:

VideoSample newVideoSample = {buf, size}; 

En ese caso, no es necesaria ninguna limpieza.

+1

Sí, de forma predeterminada, no es necesario "nuevo" o "eliminar" objetos. Úselo solo si realmente sabe por qué lo necesita. – Nikko

2

delete newVideoSample. En C++ struct es lo mismo que class pero con campos públicos predeterminados.

3

delete newVideoSample;

Sin embargo, considerar el uso de un smart pointer que liberará la memoria de forma automática, por ejemplo:

std::auto_ptr<VideoSample> newVideoSample(new VideoSample); 
+0

Consideraría primero "sin punteros". – Nikko

2

Uso delete

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

delete newVideoSample; 

También hay un overload es decir delete[]

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

delete [] newVideoSample; 

En Modern C++ siempre es recomendable utilizar punteros inteligentes. Es posible que desee utilizar boost::shared_ptr<T> desde la biblioteca de impulso.

1

Para asignar -> VideoSample * newVideoSample = new VideoSample;

Para eliminar -> delete newVideoSample;

Si elimina el objeto en el mismo contexto, es mejor que lo asigne en la pila. Si lo elimina fuera del contexto, no olvide pasar una referencia.

Y lo más importante, no elimine si su sobre el proceso para salir, no tiene sentido: P

+0

"no lo borres si estás a punto de salir del proceso, no tiene sentido" ** No. ** ¿Por qué estaba esto en +2? Como mínimo, para 'eliminar' explícitamente es autodidacta y cortés. Más aún, ¿qué sucede si el sistema operativo omite eliminar el objeto o uno de sus recursos? También garantiza que evite falsos positivos en analizadores de pérdida de memoria, etc. En realidad, 'borrar 'no es difícil, así que hágalo siempre. Si comienzas a excusar la omisión en situaciones en las que [Dr Evil fingers] "" "no debería" "importar, estás pidiendo problemas cuando te olvidas de' borrar' en una situación en la que realmente lo hace_. http://stackoverflow.com/q/677812/2757035 –

2

Si usted pretende VideoSample para liberar su miembro buffer continuación VideoSample es una clase frágil. No tiene forma de saber si buf se creó en el montón utilizando new[] o malloc, o es la dirección de una variable en la pila.

2

En C++ una estructura es exactamente igual a una clase, excepto que todo es público por defecto, donde una clase es privada por defecto. Entonces una estructura puede tener un destructor y se libera con delete.

0

* * Se crea objeto de Videosample, por lo que sólo utiliza eliminar ..

VideoSample * = newVideoSample nueva VideoSample; eliminar newVideoSample; * *

Cuestiones relacionadas