Je suis tombé sur une situation (sur Win32) où l'objet std :: ostringstream continue de consommer de la mémoire de processus, même quand il est ostensiblement effacé après une série d'opérations append-type. S'il vous plaît jeter un coup d'oeil à ce C++ fragment:C++ STL dans VS2008: std :: ostringstream lance std :: bad_alloc après un usage lourd assign/clear
int main(void)
{
std::ostringstream cOutputLogStream;
// Random long string
std::string sTest = "jkspoiauyeraspfoiusdfsdfekgpweojkgpwoekpokgkpgeopoegwj";
std::string sEmpty = "";
int n = 0;
int looper = 0;
while (n++ < 100000)
{
while (looper++ < 45)
{
cOutputLogStream << s;
}
cOutputLogStream.str(sEmpty);
cOutputLogStream.clear();
// This should give the heap manager a chance to consolidate
// fragmented memory blocks
Sleep(1);
}
}
Pendant l'exécution du temps interne() boucle, l'observation de l'utilisation de la mémoire du processus dans le gestionnaire de tâches montre une rampe ascendante continue, qui finit par se stabilise. Cependant, cette mise à niveau se produit en même temps que lorsque l'erreur std :: bad_alloc est renvoyée à plusieurs reprises. Cela suggère que la mémoire de segment a été épuisée ou que la taille de bloc demandée n'est pas disponible dans un espace contigu. Est-ce que quelqu'un d'autre a expérimenté ce phénomène de fuite avec des objets ostringstream, et quels autres objets alternatifs sont disponibles à la place de ce flaky?
Merci beaucoup!