C中的Valgrind无效free()/delete/delete[]/realloc()

C中的Valgrind无效free()/delete/delete[]/realloc(),c,memory-leaks,malloc,valgrind,free,C,Memory Leaks,Malloc,Valgrind,Free,Valgrind告诉我,内存中有漏洞,我试图释放它,但我认为这没有正确完成。有什么想法吗?多谢各位 无效的free()/delete/delete[]/realloc() 在0x4C27D4E处:自由(vg_替换_malloc.c:427) 通过0x400C00:main(main.c:149) 地址0x51ba138是大小为8的块分配后的0字节 在0x4C28BED:malloc(vg_替换_malloc.c:263) 通过0x400B0E:main(main.c:119) 堆摘要: 在出口处

Valgrind告诉我,内存中有漏洞,我试图释放它,但我认为这没有正确完成。有什么想法吗?多谢各位

无效的free()/delete/delete[]/realloc() 在0x4C27D4E处:自由(vg_替换_malloc.c:427)

通过0x400C00:main(main.c:149)

地址0x51ba138是大小为8的块分配后的0字节

在0x4C28BED:malloc(vg_替换_malloc.c:263) 通过0x400B0E:main(main.c:119)

堆摘要: 在出口处使用:1个块中有2个字节 总堆使用率:5个allocs,5个free,分配了14个字节

1个块中的2个字节肯定会在丢失记录1(共1个)中丢失

在0x4C28BED:malloc(vg_替换_malloc.c:263)

通过0x40084F:strdup(main.c:19)

通过0x4009C4:permute(main.c:83)

通过0x400B9C:main(main.c:138)

char*strdup(const char*s)
{
char*d=malloc(strlen+1);//长度的空格加上null//第19行
如果(d==NULL){
返回NULL;//没有内存
}
strcpy(d,s);//复制字符
return d;//返回新字符串
}
void置换(char*arrayOfPermutations,int startIndex,int stopIndex,
字符***排列)
{
int i;
if(startIndex==stopIndex){
**permuts=strdup(arrayOfPermutations);//保存生成的字符串//第83行
*permuts+=1;//增量位置
}否则{

对于(i=startIndex;i,在我阅读您的代码之前。Valgrind报告无效的可用错误不是因为内存泄漏,而是您尝试释放无效内存(或多次释放相同内存)。使用编译器标志-g(gdb debug)编译代码将启用更多调试信息,从而使Valgrind的回溯效果更好

快速猜测:

  ..
  for(i = 0; i <= facto-1; i++)
   {
    printf("\"%s\"\n", permuts[i]);
    free (permuts[i]); /* free the text, allocated with strdup(); */
  }

  free(permuts);//free the memory
  free(stringInput);//free the memory
}
。。

对于(i=0;i以及其他问题,代码的主要问题是:

double free or corruption (out): 0x000000000074a060 ***
原因:

char **permuts, **work;
...
work = permuts;
...
free (work);                //free the memory //line 149
free (permuts);             //free the memory

您将释放相同的内存块两次。

如果您要使用
string.h
的话,您是否有任何具体的原因重新实现
strdup
(对于
strcpy
)?您将释放两次相同的内存:
free(work)
调用
free(permutes)时,实际上释放了permutes指向的内存
您正在释放一个无效指针。我的编译器标题中未定义中的strdup。删除free(work)对我有帮助,但我使用了(I=0;I它可能来自free(work);//释放内存,此指针不是来自malloc()谢谢!free(permuts[I]);按您的要求解决了它。
char **permuts, **work;
...
work = permuts;
...
free (work);                //free the memory //line 149
free (permuts);             //free the memory