`free ()` обертка - PullRequest
       17

`free ()` обертка

1 голос
/ 07 апреля 2011

Я экспериментирую с написанием malloc и free оболочек, и мне интересно, почему следующий код выдает ошибку pointer being freed was not allocated, почему не delete() работает?

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

#define log(v) printf(#v " == %d \n", v)
#define new(n, type) _new((n), sizeof(type), __LINE__, __FILE__)

void *_new(int n, size_t size, int line, char *file)
{
    int *ptr;
    ptr = malloc(n * size);

    if (ptr == NULL) 
    {
        printf("new(): Memory allocation error, file \"%s\", line %d. \n", file, line);
        exit(EXIT_FAILURE);
    }

    return ptr;
}

void delete(int *ptr)
{
    free(*ptr);
    *ptr = NULL;
}


main()
{  
    int *p;

    p = new(1, int);
    log(p);

    delete(&p);
    log(p);
}

Ответы [ 3 ]

5 голосов
/ 07 апреля 2011

С вами

int *p;
p = new(1, int);
delete(&p);

Тогда вы должны

void delete(int** ptr) //two ** here!!
{
    free(*ptr);
    *ptr = NULL;
}
0 голосов
/ 07 апреля 2011

Проблема в этой строке

free(*ptr);

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

free(ptr);

РЕДАКТИРОВАТЬ

Почему отрицательные голоса?Функция delete совершенно неверна в отношении использования free, и мои утверждения о ней верны.Тот факт, что конкретное неправильное использование delete делает все это вроде как работает (это зависит от платформы), не делает мой ответ неверным.

0 голосов
/ 07 апреля 2011

Вы free() видите то, на что указывает указатель (*ptr), а не сам указатель ptr. Пропустил & в вызове delete();извините.

...