C中的内存分配跟踪 - 我这样做了吗?

时间:2012-07-30 02:37:55

标签: c memory-management

为了好玩(以及C编程实践),我编写了以下代码来执行以下操作:

  • 充当内存分配的跟踪系统
  • 通过函数调用释放所有动态分配的内存

以下是代码:

typedef enum _OpMode {
    OM_APPEND,
    OM_DESTROY
} OP_MODE;

void refOp(void *ptr, OP_MODE mode) {
    /* contains static array of pointers and provides an interface to that
       array */

    static void **references = NULL;
    static int size = 0;
    static int reset = 0;

    if (reset) {
        reset = 0;
        references = NULL;
        size = 0;
    }

    switch (mode) {
        case OM_APPEND:
            //add a pointer to reference array
            references = (void**) realloc(references, sizeof(void*) * (size + 1));
            references[size++] = ptr;
            break;
        case OM_DESTROY:
            //free memory at all pointers kept in reference array
            for (int i = 0; i < size; i++) {
                free(references[i]);
                references[i] = NULL;
            }
            free(references);
            reset = 1;
            break;
        default:
            printf("Invalid enum value '%d' passed as mode.\n", mode);
            break;
    }
}

void refDestroyAll() {
    //Wrapper function
    refOp(NULL, OM_DESTROY);
}

void *myAlloc(void* ptr, size_t size) {
    /* Allocates memory and stores pointer copy in reference array */
    void *tmp_ptr;
    tmp_ptr = realloc(ptr, size);
    refOp(tmp_ptr, OM_APPEND);
    return tmp_ptr;
}

我们的想法是,可以使用myAlloc()代替mallocrealloc来动态分配内存。并且可以使用refDestroyAll()释放使用myAlloc()创建的所有内存。

我已经做了一些测试,似乎正在工作,但我不禁觉得我错过了一些重要的东西。这段代码是否实际按预期工作,或者在我拨打refDestroyAll()时是否泄漏内存?

1 个答案:

答案 0 :(得分:1)

你有一个错误,可能导致分段错误。 realloc()可以返回相同的指针,在这种情况下,您可以将它添加两次到数组。当你调用你的自由函数时,它会尝试将相同的指针释放两次,从而导致分段错误。

此外,我不明白为什么你有重置参数。为什么不在OM_DESTROY情况下简单地将引用和大小设置为0?最好在释放后始终将指针设置为NULL