2009-05-22 3 views
5

Tengo un estático std::vector en una clase. Cuando uso de pérdida de memoria herramientas de detección de Microsoft:Fuga de memoria (más o menos) con un estándar estático :: vector

_CrtMemState state; 
_CrtMemCheckpoint(& state); 
_CrtMemDumpAllObjectsSince(& state); 

se reporta una fuga después de insertar cosas en el vector. Esto tiene sentido para mí porque se asigna un espacio nuevo cuando algo se inserta en el vector. Este espacio no se desasigna hasta que el programa finaliza (dado que el vector es estático). ¿Es esto correcto?

En el destructor de la clase que contiene el vector, estoy eliminando el objeto que puse en el vector. Sin embargo, la memoria asignada cuando se realizó la inserción todavía está dando vueltas. ¿Hay alguna forma de eliminar este espacio?

+0

¿Puedes mostrar el código que inserta cosas en el vector y el código al que te refieres para eliminar el objeto que colocas en el vector? –

+0

Puedo si estás interesado, pero James e ilproxyil me ayudaron a resolver el problema. Hazme saber si estas interesado. – Joe

Respuesta

16

Puede cambiar el vector por uno vacío, esto liberará la memoria.

Ver también Q: Shrinking a vector

+1

¡Impresionante! Eso funciono. Gracias. Ojalá hubiera hecho esa pregunta antes, en lugar de golpearme la cabeza contra la pared durante un par de días. :-) – Joe

+0

Esta respuesta es incorrecta: [el truco de intercambio solo _may_ libera la memoria] (http://stackoverflow.com/q/7829018/560648). –

8

que añadir a lo escribió James. Quiere decir esto:

std::vector<T>().swap(v); 

donde 'v' es el vector cuya memoria desea liberar.

+0

Gracias por los detalles. – Joe

0

Eso es solo una peculiaridad de Visual Studio. El vector destructor libera la memoria, pero el módulo de comprobación de memoria no siempre lo detecta, por lo que se queja. Es un poco molesto, pero no hay de qué preocuparse.

+1

No es un capricho de VS. Su vector era estático. Estaba revisando las filtraciones antes de que la CRT liberara la estática. –

+1

Esa es la peculiaridad. VS incorpora una versión reducida de lo que solía llamarse Nu Mega Bounds Checker. Las versiones anteriores de Bounds Checker solían funcionar bien, pero la versión incorporada con VS7.x se equivoca. Informa regularmente fugas de memoria inexistentes en objetos estáticos. –