tengo un struct
que tiene este aspecto:la memoria usada por un std :: string
struct queue_item_t {
int id;
int size;
std::string content;
};
Tengo un std::vector<queue_item_t>
que está poblada con muchos de estos de una consulta de base de datos.
Cuando se procesa cada elemento, se lee un archivo del disco y su contenido se coloca en el miembro de cadena content
. El elemento se procesa (content
se analiza) y ejecuto .clear()
en la cadena para no consumir toda la memoria.
Sin embargo, esto no parece liberar la memoria. Tengo cientos de miles de elementos procesados y, finalmente, el uso de la memoria aumentará más de lo que está disponible y la aplicación es eliminada por Linux con "falta de memoria" como razón.
¿Cómo puedo liberar la memoria utilizada por estas cadenas?
¿necesita 'content' como miembro de la estructura? Según su explicación, parece que solo se usa muy brevemente, por lo que un temporal podría ser más adecuado para la tarea. Además, ¿por qué no utilizar 'std :: queue' en lugar de' std :: vector'? –
El hecho de que su estructura se llame 'queue_item_t' sugiere que el vector de ellos representa algún tipo de cola. Si ese es el caso, ¿por qué no quitas los elementos de la cola una vez que se procesan?Lo pregunto porque es posible que la solución adecuada a su problema esté en otra parte. ¡Destruirlos (y su cadena 'content') es una manera bastante segura de liberar sus recursos! Entonces solo tiene que lidiar con el hecho de que eliminar desde el principio de un vector no es eficiente, por lo tanto, use 'deque' en su lugar, o si el orden en que se procesan no importa, entonces procese en orden inverso. –
@SanderDeDycker, la parte que estoy haciendo ahora es solo la segunda parte de todo el proceso; bajo operación normal, los datos nunca se leen de los archivos, sino que se recuperan de Internet y los datos se colocan directamente en la cadena 'content' de cada elemento que se ha descargado. Pero tienes razón, que bajo diferentes circunstancias, una variable temporal sería mejor. –