You'll need to free 'ep' when done with it.
(Each iteration!)
 

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
> Sent: Friday, October 24, 2003 8:52 AM
> To: [email protected]
> Subject: Trying to find Memory leak in function
> 
> Ok.. I have a function that seems to have (definately has) a 
> memory leak.  
> This function was based on a 'plist snippet' that I had found 
> and I have 'tweaked' it substantially to get to do what I 
> needed it to do.  
> But...Everytime I run it I lose 2mb of memory.  For the life 
> of me I can not find this leak.  I would be incredibily 
> grateful if someone can point me in the right direction.  I 
> am attaching the function below (something I have never done 
> on this list, so forgive me for taking up some space here please).
> 
> Thanks again for any help anyone can provide.
> 
> -Mike
> 
> void do_plist( CHAR_DATA *ch, char *argument ) {
>     DIR *dp;
>     FILE *fp;
>     CHAR_DATA *victim = NULL;
>     struct dirent *ep;
>     char buf[80];
>     char buf2[MSL];
>     char buf3[MSL];
>     char buffer[MAX_STRING_LENGTH*4];
>     bool fOld;
>     char arg1 [MAX_INPUT_LENGTH];
>     char arg2 [MAX_INPUT_LENGTH];
>     int days;
>     int type = 0;
>     int clan = -1;
>     int god = -1;
>     int race = -1;
> 
>     buffer[0] = '\0';
>     smash_tilde( argument );
>     argument = one_argument( argument, arg1 );
>     argument = one_argument( argument, arg2 );
> 
>     if ( arg1[0] == '\0' && IS_IMMORTAL(ch))
>     {
>         send_to_char( "Syntax: plist clan   (name)\n\r", ch );
>         send_to_char( "        plist god    (name)\n\r", ch );
>         send_to_char( "        plist race   (name)\n\r", ch );
>         send_to_char( "        plist tier1\n\r", ch );
>         send_to_char( "        plist tier2\n\r", ch );
>         send_to_char( "        plist immortals\n\r", ch );
>         return;
> 
>     }
> 
>     if ( arg1[0] == '\0' && !IS_IMMORTAL(ch))
>     {
>         send_to_char( "Syntax: plist clan\n\r", ch );
>         send_to_char( "        plist god\n\r", ch );
>         send_to_char( "        plist race\n\r", ch );
>         return;
>     }
> 
>     if (!str_prefix (arg1, "clan"))
>     {
>       if (arg2[0] == '\0' && IS_IMMORTAL(ch))
>       {
>         send_to_char( "Which clan?{x\n\r",ch);
>         return;
>       }
> 
>       if (IS_IMMORTAL(ch))
>       {
>         if ((clan = clan_lookup (arg2)) == 0)
>         {
>           send_to_char ("No such clan exists.\n\r", ch);
>           return;
>         }
>       }
>       else if (is_clan(ch))
>       clan = ch->clan;
>       else
>       {
>       send_to_char("You are not in a clan.{x\n\r",ch);
>       return;
>       }
>       type = 1;
>     }
> 
>     if (!str_prefix (arg1, "god"))
>     {
>       if (arg2[0] == '\0' && IS_IMMORTAL(ch))
>       {
>         send_to_char( "Which god?{x\n\r",ch);
>         return;
>       }
> 
>       if (IS_IMMORTAL(ch))
>       {
>         if ((god = god_lookup (arg2)) == 0)
>         {
>           send_to_char ("No such god exists.\n\r", ch);
>           return;
>         }
>       }
>       else if (is_godfol(ch))
>       god = ch->god;
>       else
>       {
>       send_to_char("You are not in a church.{x\n\r",ch);
>       return;
>       }
>       type = 2;
>     }
> 
>     if (!str_prefix (arg1, "race"))
>     {
>       if (arg2[0] == '\0' && IS_IMMORTAL(ch))
>       {
>         send_to_char( "Which race?{x\n\r",ch);
>         return;
>       }
> 
>       if (IS_IMMORTAL(ch))
>       {
>         if ((race = race_lookup (arg2)) == 0)
>         {
>           send_to_char ("No such race exists.\n\r", ch);
>           return;
>         }
>       }
>       else
>       race = ch->race;
>       type = 3;
>     }
> 
>     if (!str_prefix (arg1, "tier1") && IS_IMMORTAL(ch))
>     {
>       type = 4;
>     }
> 
>     if (!str_prefix (arg1, "tier2") && IS_IMMORTAL(ch))
>     {
>       type = 5;
>     }
> 
>     if (IS_IMMORTAL(ch) && !str_prefix (arg1, "immortals"))
>     {
>       type = 6;
>     }
> 
>     if (type < 1 && IS_IMMORTAL(ch))
>     {
>         send_to_char( "Syntax: plist clan   (name)\n\r", ch );
>         send_to_char( "        plist god    (name)\n\r", ch );
>         send_to_char( "        plist race   (name)\n\r", ch );
>         send_to_char( "        plist tier1\n\r", ch );
>         send_to_char( "        plist tier2\n\r", ch );
>         send_to_char( "        plist immortals\n\r", ch );
>         return;
> 
>     }
>     if (type < 1 && !IS_IMMORTAL(ch))
>     {
>         send_to_char( "Syntax: plist clan\n\r", ch );
>         send_to_char( "        plist god\n\r", ch );
>         send_to_char( "        plist race\n\r", ch );
>         return;
> 
>     }
> 
>     if (type == 1)
>     {
>      sprintf(buf3, "Last Login Report for 
> %s{x\n\r\n\r",clan_table [clan].who_name);
>      send_to_char (buf3, ch);
>     }
> 
>     if (type == 2)
>     {
>      sprintf(buf3, "Last Login Report for 
> %s{x\n\r\n\r",god_table [god].who_name);
>      send_to_char (buf3, ch);
>     }
> 
>     if (type == 3)
>     {
>      sprintf(buf3, "Last Login Report for 
> %s{x\n\r\n\r",race_table [race].who_name);
>      send_to_char (buf3, ch);
>     }
> 
>     if (type == 4)
>     {
>      sprintf(buf3, "Last Login Report for Tier 1 Players{x\n\r\n\r");
>      send_to_char (buf3, ch);
>     }
> 
>     if (type == 5)
>     {
>      sprintf(buf3, "Last Login Report for Tier 2 Players{x\n\r\n\r");
>      send_to_char (buf3, ch);
>     }
>     if (type == 6 && IS_IMMORTAL(ch))
>     {
>      sprintf(buf3, "Last Login Report for Immortals{x\n\r\n\r");
>      send_to_char (buf3, ch);
>     }
> 
>     dp = opendir ("../player");
> 
>     if (dp != NULL)
>     {
>         while ( (ep = readdir (dp)) )
>         {
>             if ( ep->d_name[0] == '.' )
>                 continue;
> 
>     victim = new_char();
>     victim->pcdata = new_pcdata();
>     fOld = FALSE;
> 
>     sprintf( buf2, "%s%s", PLAYER_DIR, capitalize( ep->d_name ) );
>     if ( ( fp = fopen( buf2, "r" ) ) != NULL )
>     {
>         int iNest;
> 
>         for ( iNest = 0; iNest < MAX_NEST; iNest++ )
>             rgObjNest[iNest] = NULL;
> 
>         fOld = TRUE;
> 
>         for ( ; ; )
>         {
>             char letter;
>             char *word;
> 
>             letter = fread_letter( fp );
>             if ( letter == '*' )
>             {
>                 fread_to_eol( fp );
>                 continue;
>             }
> 
>             if ( letter != '#' )
>             {
>                 bug( "Load_char_obj: # not found.", 0 );
>                 break;
>             }
> 
>             word = fread_word( fp );
>             if      ( !str_cmp( word, "PLAYER" ) ) 
> fread_char( victim, fp );
>             else if ( !str_cmp( word, "OBJECT" ) ) break;
>             else if ( !str_cmp( word, "O"      ) ) break;
>             else if ( !str_cmp( word, "PET"    ) ) break;
>             else if ( !str_cmp( word, "END"    ) ) break;
>             else
>             {
>                 bug( "Load_char_obj: bad section.", 0 );
>                 break;
>             }
>         }
>         fclose( fp );
>     }
> 
>          if (!fOld)
>            continue;
> 
>          if (type == 1 && (victim->clan != clan || 
> IS_IMMORTAL(victim)))
>          continue;
> 
>          if (type == 2 && (victim->god != god || IS_IMMORTAL(victim)))
>          continue;
> 
>          if (type == 3 && (victim->race != race || 
> IS_IMMORTAL(victim)))
>          continue;
> 
>          if (type == 4 && (victim->tier > 1 || IS_IMMORTAL(victim)))
>          continue;
> 
>          if (type == 5 && (victim->tier != 2 || IS_IMMORTAL(victim)))
>          continue;
> 
>          if (type == 6 && (!IS_IMMORTAL(victim) || 
> victim->level > ch->level))
>          continue;
> 
> 
>             sprintf( buf, "%s%s", "../player/", ep->d_name );
> 
>             days = days_since_last_file_mod( buf );
> 
>             sprintf( buf, "%-15s %s%-3d{x days\n\r",
>                 ep->d_name, days >= 30 ? "{r" : days >= 15 ? 
> "{Y" : days >= 10 ? "{g" : "{G", days);
>             strcat( buffer, buf );
>         }
>         closedir (dp);
>         free_pcdata(victim->pcdata);
>         free_char(victim);
>     }
>     else
>         perror ("Couldn't open the directory");
> 
>     page_to_char( buffer, ch );
>     free_string(buffer);
>     free_string(buf);
>     free_string(buf2);
>     free_string(buf3);
>     return;
> }
> 
> 
> --
> ROM mailing list
> [email protected]
> http://www.rom.org/cgi-bin/mailman/listinfo/rom
> 

Reply via email to