`free()`包装器

时间:2011-04-06 22:23:07

标签: c malloc free

我正在尝试编写mallocfree包装器,我想知道为什么下面的代码会出现错误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 个答案:

答案 0 :(得分:5)

既然你,

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

然后你应该

void delete(int** ptr) //two ** here!!
{
    free(*ptr);
    *ptr = NULL;
}

答案 1 :(得分:0)

free()指针指向的东西(*ptr),而不是指针ptr本身。 错过了&来电中的delete();遗憾。

答案 2 :(得分:-1)

问题在于这一行

free(*ptr);

free函数需要一个指针值,但你要给它一个int。试试这个

free(ptr);

修改

为什么会掉线?关于free的使用,delete函数是不正确的,我的陈述是正确的。 delete的特定错误用法使其完全有效(它的正确性取决于平台)这一事实并不能使我的答案不正确。