Malloc asigna más memoria de la necesaria al usar soci::use.
Mientras investigábamos un extraño error de tmalloc, mi colega y yo rastreamos el error hasta una sola línea de código:
soci::session db;
…
db << "INSERT INTO public.tablename
(…, …, textvalue) VALUES ('…', '…', :1);",
soci::use(std::to_string(someStruct.getUint32_t()) + "." + std::to_string(someStruct.getUint32_t()));
Todo funcionó correctamente cuando lo cambiamos a:
soci::session db;
…
std::string temp = std::to_string(someStruct.getUint32_t()) + "." + std::to_string(someStruct.getUint32_t());
db << "INSERT INTO public.tablename
(…, …, textvalue) VALUES ('…', '…', :1);",
soci::use(temp);
Obtuvimos el error de tmalloc en la primera versión porque el primer fragmento de código quería asignar aproximadamente 1,8 GB en el punto donde se ensambla esta cadena en la lista de parámetros y no había suficiente memoria disponible en el sistema correspondiente. Después de que tercerizamos el ensamblaje de la cadena como se ve en el segundo fragmento de código, este error no ocurrió más. Obviamente, esta cadena construida a partir de 2 enteros y un solo punto no necesita nada cerca de 1,8 GB.
Estaría muy agradecido si alguien pudiera explicarme qué está sucediendo exactamente. Sospechamos que tiene algo que ver con la deducción de plantillas relacionada con alguna mágica biblioteca soci, pero no estamos seguros.
davy.ai
El error de tcmalloc se produjo debido a la insuficiencia de memoria disponible durante el ensamblado de la cadena en el primer fragmento de código. Cuando la cadena se construyó a partir de dos enteros y un solo punto, no requería 1.8GB de memoria. Este problema podría estar relacionado con la deducción de plantillas y la biblioteca soci. Externalizar el ensamblado de la cadena en una variable de cadena separada solucionó el error.