Re: Possible memory leak?

From: George Greer (
Date: 12/01/01

On Sat, 1 Dec 2001, The Arrow wrote:

>In CircleMUD 3.0 (patchlevel 19), when a new player creates a character,
>and gets assigned an already existing slot in the player_table (that was
>used by a now deleted player), player_table[x].name is not free'd.

Right, because it reuses the slot.

>The solution I made, was to do it in create_entry() (db.c), where I put
>an else at the end of the if, and in there free the name if it's not

The new character is written to the same spot as the old one so the player
table does not need updated:

      if ((player_i = load_char(tmp_name, &tmp_store)) > -1) {
        store_to_char(&tmp_store, d->character);
        GET_PFILEPOS(d->character) = player_i;

        if (PLR_FLAGGED(d->character, PLR_DELETED)) {
          /* We get a false positive from the original deleted character. */
          /* Check for multiple creations... */
          if (!Valid_Name(tmp_name)) {
            SEND_TO_Q("Invalid name, please try another.\r\nName: ", d);
          CREATE(d->character, struct char_data, 1);
          CREATE(d->character->player_specials, struct player_special_data, 1);
          d->character->desc = d;
          CREATE(d->character->, char, strlen(tmp_name) + 1);
          strcpy(d->character->, CAP(tmp_name));
>>>>>     GET_PFILEPOS(d->character) = player_i;
          sprintf(buf, "Did I get that right, %s (Y/N)? ", tmp_name);
          SEND_TO_Q(buf, d);
          STATE(d) = CON_NAME_CNFRM;
        } else {

So create_entry() will not be called again:

    if (GET_PFILEPOS(d->character) < 0)
      GET_PFILEPOS(d->character) = create_entry(GET_PC_NAME(d->character));

Subtle, but correct.

George Greer

   | FAQ: |
   | Archives: |

This archive was generated by hypermail 2b30 : 06/24/03 PDT