Esta mañana, mi compañero de prácticas (el programa es para una práctica de la universidad, que no lo había dicho ), ha hablado con el profesor y lo han solucionado.
Todavía no me ha pasado el código, en cuento pueda os lo pego aquí, por si alguna vez os pasa lo mismo .
Parece ser que la consulta al map está mal hecha, y que a la vez que consulta inserta nuevos elementos en este, supongo que cuando consulta un elemento que no existe.
Lightworker, en teoría al pasar por referencia es como pasar con un puntero, pero luego no tienes que dereferenciar (o lo que sea, que me lío con estos nombrecitos xD), ¿no? De todas formas, aunque eso sea una mejora en el programa, que se agradece, el problema no estaba ahí.
Por otro lado, la estructura del programa es:
1- Leer el diccionario de frecuencias.
2- Leer el texto a segmentar.
3- Segmentar según el método que elijas. Aquí es donde si utilizabamos el map se comía toda la memoria. En cambio, con el trie segmenta, ocupa la memoria que le toca y al salir de la función la libera correctamente.
Edit:
Ya tengo la solución. El problema es que al hacer la comprobación
if (dic[t.substr(i, j - i)] != 0)
si no existe la clave en el diccionario, crea su entrada. En el bucle la mayor parte de las consultas al diccionario son de claves que no existen, por lo que se crean muchas (muchísimas) entradas nuevas y se desboca el consumo de memoria.
Por eso si el texto que le pasaba era uno pequeño repetido varias veces (de menos de un KB hasta ser un mega) , no consumía casi memoria, pero si le pasaba uno sin repetir, aunque solo fuera de unos pocos kilobytes.
Al final, el método correcto es primero buscar con un find la clave, y si existe ya consultar su valor. Así:
if (dic.find(s) != dic.end())
double aux = max(P[j], P * dic);