Forum Programmation.c++ Fuite de mémoire avec la classe

Posté par  .
Étiquettes : aucune
0
12
juil.
2004
J'ai une fuite de mémoire vraiment étrange dans un programme. J'ai une fonction que si j'éxécute son code, il n'y a aucun problème. Mais si j'exécute en boucle un appel de cette fonction c'est là que j'ai une fuite. Quelqu'un a une idée? Voici le code en question:

void mIMEOnlineManager::SetUsername(unsigned int iUser, const char *cUsername) {
mIMEDatabase mdCheckUser;
string sMsg;

if (!mdCheckUser.CheckUser(cUsername)) {
sMsg = mIME::CreateDisconnectMsg(ERRUSERNOTFOUND);
mscMainSocketManager->SendText(iUser, sMsg.c_str(), sMsg.length());
mscMainSocketManager->ShutdownConnection(iUser);
}
else {
mIMEClientsListByUser[iUser]->sUsername = cUsername;

sMsg = "" + mIME::CreateRandomString() + ""
+ mIME::CreateRandomString() + "";

mscMainSocketManager->SendText(iUser, sMsg.c_str(), sMsg.length());
}
}

Si je place le bloc if/else dans un while (true) ça ne fuit pas.

Voici le code d'appel de cette fonction:

if (!strcmp(xcParams[i], "username")) {
momOnlineSystem->SetUsername(iCurrentDataUser, xcParams[i + 1]);
}

xcParams est de type XML_Char (C'est comme un pointeur char*, j'utilise expat pour parser du XML).

Si je place ce if dans un while (true) la mémoire monte sans arrêt!

Quelqu'un a une idée?

Merci

Gabriel Lavoie
  • # Oubliez!

    Posté par  . Évalué à 2.

    Une gaffe de ma part! Le leak se trouve ailleur...
    • [^] # Re: Oubliez!

      Posté par  . Évalué à 3.

      au passage, tu ferais bien d'utiliser encore plus les std::string


      petite erreur

      sMsg.c_str(), sMsg.length()

      manqué : strlen(sMsg.c_str()) <= sMsg.length()

      préfère
      sMsg.data() qui n'est pas limité par un '\0', les std::string pouvant contenir tout char. c'est donc préférable dans un contexte non-ASCII
      • [^] # Re: Oubliez!

        Posté par  . Évalué à 1.

        Petite question sinon, est-ce que c'est possible d'utiliser la classe string entre une app et un dll/so (win/linux)? J'avais essayé un exemple simple que le dll retournait une string et ça fuyait à mort! le même exemple ne fuyait pas si ma fonction était directement dans le programme.
        • [^] # Re: Oubliez!

          Posté par  . Évalué à 1.

          c'est sans doute parce que les versions de std::string sont différentes ... à moins que j'ai rien compris aux sombres conneries des DLL ou il que la DLL désalloue elle même la mémoire qu'elle a allouée
          • [^] # Re: Oubliez!

            Posté par  . Évalué à 1.

            Le DLL est l'exécutable sont compilés avec le même compilateur (MinGW - GCC 3.4).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.