2013-12-14 3 views
5

У меня есть эта ошибка со следующим кодом:«Указатель, освобожденный, не был выделен». ошибка после таНоса, перераспределить

int main(){ 
    point *points = malloc(sizeof(point)); 
    if (points == NULL){ 
     printf("Memory allocation failed.\n"); 
     return 1; 
    } 
    other_stuff(points); 
    free(points); 
    return 0; 
} 
void other_stuff(point points[]){ 
    //stuff 
    realloc(points, number*sizeof(point)) 
} 

Я искал, но нашла только примеры, когда стало ясно, что не было никакого распределения.

Здесь я использовал malloc для инициализации points, а затем изменил его размер на realloc; так как указатель «не выделен», когда я прихожу к free?

+0

'points' объявлен в' main'. Как может 'other_stuff' получить к нему доступ? – AVP

+0

@AVP извините пропустил это. Отредактировано в. (Было в моем коде) – OJFord

ответ

8

realloc может переместить память в новое место (если для расширения старого указателя недостаточно места). Если это произойдет, вам нужно освободить новый указатель.

Попробуйте этот твик:

int main(){ 
    point *points = malloc(sizeof(point)); 
    if (points == NULL){ 
     printf("Memory allocation failed.\n"); 
     return 1; 
    } 
    other_stuff(&points); 
    free(points); 
    return 0; 
} 
void other_stuff(point **points){ 
    //stuff 
    point *temp = realloc(*points, number*sizeof(point)); 
    if(temp != NULL) { 
     *points = temp; 
     // and do your stuff 
    } 
    else { 
     // panic? memory reallocation failed. Deal with it gracefully. 
    } 
} 

Передавая ручку к other_stuff, мы даем это контролировать не только над местом, где указатель наведен, но в адрес самого указателя. Это позволяет перемещать память. Ручки - это хороший способ динамического управления памятью; но концептуально указатель на указатель немного привыкает к ...

+0

-1 Если 'realloc' не работает, вы пропускаете память. При использовании 'realloc' вы назначаете временное первое, а затем проверяете результат. –

+0

@EdS Вы правы. Я думаю, что мое редактирование исправлено. – Floris

+0

Downvote удален. –

2

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

Как использовать realloc:

whataver *f = malloc(count * sizeof(*f)); 
/* ... */ 
whatever *temp = realloc(f, new_count * sizeof(*temp)); 
if (temp) 
    f = temp; // realloc worked, f is no longer valid/needed 
else 
    free(f); // error 

realloc может возвращать один и тот же указатель, или это не может. Дело в том, что вы больше не заботитесь об исходном указателе, если realloc удалось. Если ему нужно было выделить новый блок, исходный указатель недействителен. Если это не так, то он вернет тот же указатель, и вы, разумеется, не захотите немедленно освободить его.

+0

Простите, что точки не локальные по основному в коде, отредактировал мой OP. – OJFord

+0

@OllieFord: редактирование не исправило эту проблему, но что бы это ни было, это не важно. –

+0

Хорошо, если это работает, никогда не должно быть 'free'd? – OJFord

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