1

只是为了好玩(和 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()

4

1 回答 1

1

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

另外,我不明白你为什么有 reset 参数。为什么不简单地将引用和大小设置为 0 OM_DESTROY?在释放指针后立即将指针设置为 NULL 是一种很好的做法。

于 2012-07-30T04:51:42.913 回答