2016-10-17 3 views
0

У меня проблема, когда, когда я вызываю функцию, которую я написал для бесплатной структуры, моя программа завершается первой свободной инструкцией.Функция освобождения структуры в C

Вот функция:

void deleteJobNode(struct jobNode *node) { 
    free(node->burstTime); 
    free(node->jobIndex); 
    free(node->next); 
    free(node->priority); 
    free(node->remainingTime); 
    free(node); 
} 

Вот определение структуры и функция, используемая для выделения памяти для структуры.

struct jobNode { 
    struct jobNode *next; 
    int jobIndex; 
    int burstTime; 
    int remainingTime; 
    int priority; 
}; 

struct jobNode *createJobNode(int newJobIndex, int newBurstTime, int newRemainingTime, int newPriority) { 
    struct jobNode *newNode = (struct jobNode *)malloc(sizeof(struct jobNode)); 
    newNode->jobIndex = newJobIndex; 
    newNode->burstTime = newBurstTime; 
    newNode->remainingTime = newRemainingTime; 
    newNode->priority = newPriority; 

    if(newNode == NULL) 
     printf("Node Creation Error"); 

    return newNode; 
} 

Я редактировал свободную функцию, как предложено:

void deleteJobNode(struct jobNode *node) { 
    free(node); 
} 

Однако я получаю эту ошибку во время выполнения:

*** Error in `/home/jack7521/workspace/req1b/Debug/req1b': double free or corruption (fasttop): 0x00000000010c2090 *** 
+0

Отредактируйте код, как задумано, я все равно получаю сообщение об ошибке –

+0

Возможно, ошибка в том или иконе вашего кода. Обновите свой вопрос с помощью [Минимального, полного, проверяемого примера] (http://stackoverflow.com/help/mcve). – dbush

+0

Вы должны проверить возвращаемое значение malloc 's сразу после того, как вы его вызвали. Здесь вы пытаетесь получить доступ к элементам структуры, чтобы инициализировать их, прежде чем проверять, был ли возвращен нулевой указатель. – jule

ответ

2

Вы делаете один вызов к таНос; так почему вы думаете, что вам нужно несколько звонки на бесплатно?!

Вещь: вам нужно только бесплатно эта структура один раз - окончательный free(node) выполняет эту работу!

Имейте в виду, что эти методы делают для вас: malloc обозначает смежную область памяти для использования; и бесплатно отказывается от этого Площадь. Нет смысла свободно распускать членов вашей структуры. Потому что они в пределах эта область так или иначе.

Или под другим углом: malloc дает вам кучу байтов. Тот факт, что вы позже используете эти байты, используя этот «struct» «overlay», не важен вообще!

4

Для каждого malloc вам нужен free. Вам не нужно освобождать нединамические поля struct, они уже являются частью самого struct, поэтому достаточно освободить указатель на все struct.

Вам просто нужно:

free(node); 
+0

даже вам не нужно называть 'free (bufptr-> next)', поскольку он должен быть создан в другом вызове 'createJobNode', поэтому он будет освобожден дважды, если вы вызовете его для этого узла и следующего. Наверное, проблема на самом деле здесь. –

0

Вы только должны использовать free с указателем на экземпляр структуры.

void deleteJobNode(struct jobNode *node) { 
    free(node); // will do the whole job 
} 

Потому что, когда вы выделить память с malloc вызова это один большой пучок памяти, которая может быть выпущена сразу с free.

Только если ваша структура содержит указатели, которые также указывают на другую динамически распределенную память, вы должны вызвать free с этими элементами структуры.

-1

Вы возвращаете адрес локальной переменной (newNode) в функцию createJobNode. newNode не имеет видимости вне функции createJobNode.Попробуйте выделить память для newNode в основной функции и передать его в качестве параметра в createJobNode (в данном случае это будет функция пустоты) как этого

void createJobNode(struct jobNode* newNode, ...) 
{ 
    //Fill the fields of newNode 

} 

int main(void) 
{ 
    struct jobNode * newNode = malloc(sizeof(struct newNode)); 

    createJobNode(newNode, ...); 

} 

Чтобы освободить выделенную переменную newNode, вам нужно звоните по телефону:

free(newNode); 
+0

Этот ответ полностью не связан с заданной проблемой. –

+0

@ Luis Colorado перед тем, как комментировать, пользователи должны правильно прочитать вопрос и ответы. Мы здесь не только для ответа на вопрос, но и для исправления плохого кодирования (например, C-функция, возвращающая адрес локальной переменной). – shamba

+0

Вы правы в первом предложении. Но наводнение нормального пучка ответа с не связанными с деталями проблемы без каких-либо предложений, связанных с вопросами, без каких-либо процентов, если таковые имеются, кому-либо (даже на вопрос об этом). Этот сайт - это не только форум, на котором можно решить вашу проблему, но проблемы служат для многих людей (а не только для искателей), чтобы проконсультироваться для реального реального кода. В следующий раз, если вы goint, чтобы указать что-то, не связанное с проблемой, сделайте это в комментариях, а не в ответе. Вы не получите его вниз. –

Смежные вопросы