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

Posted

技术标签:

【中文标题】堆损坏 - 调试断言失败。在 dbgheap.c 第 1322 行表达式 _crtIsValidHeapPointer(pUserData)【英文标题】:Heap corruption - debug assertion failed. in dbgheap.c line 1322 expression _crtIsValidHeapPointer(pUserData) 【发布时间】:2018-05-09 07:14:42 【问题描述】:

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

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

【问题讨论】:

你可以尝试在没有free(uf-&gt;parent); free(uf-&gt;rank);的情况下运行程序并检查错误是否再次出现.. union_find_t; 是指针的 typedef,因此 malloc(sizeof(union_find_t)); 只是为指针分配空间,而不是为结构分配空间。看起来您应该从 typedef 中删除 * @BoPersson - 实际上你的解决方案可能更好。虽然 typedef struct union_find_t int* parent; int* 排名;整数组件; union_find_t;看起来有点奇怪 这是一个品味问题。如果你在任何地方都写struct union_find_t,你甚至不需要typedef。通常的原因是避免在名称前输入struct 从 typedef 中删除 * 一切正常,但是,从结构的角度来看,您将 struct 命名空间与 typedef 命名空间以及具有相同名称的事物混合在一起在两者中不必引用相同的类型。 【参考方案1】:

这个:

typedef struct union_find_t

是一个类型定义:

*union_find_t;

所以当你这样做时:

malloc(sizeof(union_find_t));

您只需为指向该结构的指针分配空间,而不是为您需要的结构分配空间!

尝试:

malloc(sizeof(struct union_find_t));

改为。

【讨论】:

以上是关于堆损坏 - 调试断言失败。在 dbgheap.c 第 1322 行表达式 _crtIsValidHeapPointer(pUserData)的主要内容,如果未能解决你的问题,请参考以下文章

调试断言失败:_CrtIsValidHeapPointer(pUserData)

c++错误:调试断言失败

从发布模式更改为调试模式时出现“调试断言失败”错误

0xc0000374 未附加调试时 Cli/Cpp 代码中的堆损坏

调试断言失败

调试断言失败,向量下标超出范围