gpt4 book ai didi

c - 在函数外释放内存会导致双重释放或损坏错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:31 25 4
gpt4 key购买 nike

我遇到一个问题,当我尝试释放内存时,在我分配该内存块的函数之外,即使我已经将指针传递给内存块指向该函数之外的指针。

我的代码是这样的,在 main() 函数中,我调用了定义为 char * reverseComplement(char * pattern); 的函数:

char * rev = reverseComplement(dna_input);

其中 dna_input 是一个 char 指针,指向在 main() 中分配的已分配内存块。在 reverseComplement() 函数中,有一行用于分配内存,然后在最后返回指向该内存块的指针。

...
...
char * revcomplpattern = (char *)malloc(strlen(pattern));
...
...
return revcomplpattern;

我认为可能导致该问题的一个原因是,在 reverseComplement() 函数完成执行后,它的堆栈被拆除,因此我将无法访问堆上的内存。但这不应该是因为我已经将堆分配内存的句柄从驻留在 reverseComplement() 中的 revcomplpattern 传递给 rev 位于 main() 中。所以 main() 中的 free(rev) 应该可以完成这项工作。

我不知道我在这里做错了什么,非常感谢任何帮助!

最佳答案

...where dna_input is a char pointer to a block of allocated memory that was allocated within main(). Within the reverseComplement() function, there is a line where I allocate memory and then return the pointer to that block of memory at the very end.

您的想法告诉我,您正在分配内存并以某种方式在 reverseComplement() 函数中使用该内存,但在该函数中,您正在分配另一个内存块。我不确定为什么。

...a problem where I get double free or corruption error...

您需要确保在程序出于任何原因退出时释放程序中所有已分配的内存块。如果不是,那么您将发生内存泄漏。

如果你必须在一个函数内分配内存(我不推荐),那么你可以使用这样的代码:

char *getnewblock(int size)
{
char *secondblock=malloc(size);
return secondblock;
}

int main()
{
char *myblock = malloc(1000);
char *myblock2 = getnewblock(5000);
free(myblock);
free(myblock2);
return 0;
}

上面的程序分配了 1000 字节的内存,然后调用一个函数来分配 5000 字节的内存,然后释放这两个内存块。

我真正建议你做的是只在一个函数中分配内存,然后在子函数中使用相同的内存块,如下所示:

void insertfirstchar(char *block,char onechar)
{
block[0]=onechar;
}

int main()
{
char *myblock = malloc(1000);
insertfirstchar(myblock,'A');
free(myblock);
return 0;
}

在上面的程序中,分配了1000个字节,然后调用一个函数使内存块的第一个字节成为字母“A”,然后释放内存。最后一个程序可以用作您的起点。

关于c - 在函数外释放内存会导致双重释放或损坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38189244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com