Проблема с кучей при удалении структуры - PullRequest
0 голосов
/ 21 ноября 2011

Когда я пытаюсь удалить структуру, полученную из очереди. Она выдаст ошибку кучи во время выполнения.

вот мой образец.

   /* "Message_content" structure hold the content of message and body. */
   typedef struct msgContent
   {
     char *message;
     char *body;
     struct msgContent *nextptr;
   }Message_content;

static Message_content *frontptr;
static Message_content *rearptr;

Message_content* msgContent;
msgContent = QueueDelete();
free(msgContent); //**error happens while calling this function**.

Вот моя функция QueueDelete () в c.

static Message_content* QueueDelete()
{
Message_content *tempMsgContent = NULL;

if(frontptr == NULL)
{
}
else if(frontptr==rearptr)
{
    tempMsgContent = frontptr;
    tempMsgContent->nextptr = NULL;
    frontptr = rearptr = NULL;
}
else
{
    tempMsgContent = frontptr;

    frontptr = frontptr->nextptr;
            tempMsgContent->nextptr = NULL; // rectify the problem said by philong
}
return tempMsgContent;
}

EDIT Добавить функцию вставки в очередь, которая придаст смысл моему коду.

вот моя функция вставки в очередь в c

  static int QueueInsert(char *message ,char *body)
  {
    Message_content *tempMsgContent  = (Message_content*) malloc(sizeof(Message_content*));
   if(rearptr == NULL && frontptr == NULL) 
   {
    rearptr = tempMsgContent;
    rearptr->message = message;
    rearptr->body = body;
    rearptr->nextptr=NULL;
    frontptr = rearptr;
    return 1;
   }
    rearptr->nextptr = tempMsgContent;
    rearptr = rearptr->nextptr;
    rearptr->body = body;
    rearptr->message = message;
    rearptr->nextptr = NULL;
    return 1;
    }

1 Ответ

3 голосов
/ 21 ноября 2011

Это может быть вашей проблемой:

tempMsgContent = frontptr;
tempMsgContent->nextptr = NULL;
frontptr = frontptr->nextptr;

Вы устанавливаете nextptr из tempMsgContent в NULL, что хорошо, но frontptr и tempMsgContent по-прежнему указывают на то жеячейка памяти!

Установите nextptr на NULL после , изменив frontptr.

Редактировать Проверка через QueueInsertкод, я вижу эту строку:

Message_content *tempMsgContent  = (Message_content*) malloc(sizeof(Message_content*));

То, что это делает, это выделить достаточно памяти для указатель (sizeof(Message_Content*))!Вы должны использовать sizeof(Message_Content) без звездочки.Это, безусловно, испортит вашу кучу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...