free (): недопустимый указатель и как повторно использовать освобожденный указатель - PullRequest
1 голос
/ 06 мая 2020

Я хочу адресовать свой указатель на другой объект и освободить память предыдущего объекта. Я так и сделал, но у меня возникла ошибка неверного указателя. Как правильно это сделать?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    int number = 5;
    int number2 = 10;

    // Give memory manually 
    int *pointer2number = (int *) malloc(sizeof(int));
    pointer2number = &number;

    printf("Number is %i\n", number);       
    printf("Address of number is %p\n", pointer2number);

    // Free memory 
    free(pointer2number);
    pointer2number = (int *) malloc(sizeof(int));
    pointer2number = &number2;
    printf("New number is %i\n", *pointer2number);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Поскольку pointer2number назначается адрес number (вызывая утечку памяти, потому что теперь выделенное пространство потеряно), free(pointer2number); - это попытка освободить объект без кучи, которая является недопустимой.

Просто выполните:

//...
pointer2number = &number; //make it point to number

printf("Number is %i\n", number);       
printf("Address of number is %p\n", pointer2number);

pointer2number = &number2; //make it point to number2
printf("New number is %i\n", *pointer2number);
//...

В этом случае выделение памяти не требуется.

0 голосов
/ 06 мая 2020
int *pointer2number = (int *) malloc(sizeof(int));
pointer2number = &number;

Вы назначаете адрес number указателю pointer2number и этим заменяете адрес выделенной динамической c памяти, хранящейся в pointer2number ранее.

То же самое происходит для второй попытки с number2.

Любая попытка free() памяти, ранее не выделенной функцией управления памятью, вызывает неопределенное поведение:

" Функция free заставляет пространство, на которое указывает ptr, освобождается, то есть становится доступным для дальнейшего выделения. Если ptr является нулевым указателем, никаких действий не происходит. В противном случае , если аргумент не соответствует указателю, ранее возвращенному функция управления памятью, или если пространство было освобождено вызовом free или reallo c, поведение не определено ."

Источник: ISO / IEC 9899: 2018 (C18), Раздел 7.22.3.3/2

И как побочный эффект, ранее выделенная динамическая c память не соответствует free() d и с этим.

вдумайтесь в логи c своей проги баран!

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