堆损坏 - 调试断言失败。在dbgheap.c第1322行表达式_crtIsValidHeapPointer(pUserData)

时间:2017-11-25 15:06:36

标签: c pointers memory-management malloc heap

在运行时,我得到调试断言失败。

in dbgheap.c line 1322 expression _crtIsValidHeapPointer(pUserData)

如果我在调试器中运行,我会得到一个在下面显示的行中触发的断点。

如何修复此分配/解除分配错误?

我在头文件中有两个函数:

struct union_find_t;

struct union_find_t* union_find_init(int n);

void union_find_free(struct union_find_t* uf);

在.c文件中,这两个函数的实现是:

typedef struct union_find_t { 
    int* parent;
    int* rank;
    int components;
} *union_find_t;


struct union_find_t* union_find_init(int n) {

    struct union_find_t* uf = malloc(sizeof(union_find_t));
    uf->parent = malloc(n * sizeof(int));
    uf->rank = malloc(n * sizeof(int));
    uf->components = n;
    for (int i = 0; i < n; ++i) {
         uf->parent[i] = i;
         uf->rank[i] = 0;
    }
    return uf;
}

void union_find_free(struct union_find_t* uf) {
     free(uf->parent);
     free(uf->rank);
     free(uf);  //*** breakpoint triggered here
}

1 个答案:

答案 0 :(得分:1)

此:

typedef struct union_find_t

是一个typedef:

*union_find_t;

所以当你这样做时:

malloc(sizeof(union_find_t));

你只是为那个结构分配一个指针的空间,而不是你需要的结构!

尝试:

malloc(sizeof(struct union_find_t));

代替。