【发布时间】:2016-11-06 10:52:32
【问题描述】:
我遇到了一个问题,当我尝试在分配该内存块的函数之外释放内存时出现双重释放或损坏错误,即使我已将指针传递给内存块指向该函数之外的指针。
我的代码是这样的,在 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 传递到位于main() 的rev。所以main() 中的free(rev) 应该可以完成这项工作。
我不知道我在这里可能做错了什么,非常感谢任何帮助!
【问题讨论】:
-
malloc(strlen(pattern))-->malloc(strlen(pattern)+1) -
在函数中分配内存不是最好的习惯,它们使调用者有责任调用
free()。 -
首先,删除演员表,然后看看编译器告诉你什么。
-
到目前为止,您所描述的内容没有任何问题(尽管@BLUEPIXY 可能发现了第二个问题)。解决此类问题的一种方法是反复减少代码,将其缩小到最小的可重现情况,以便找到触发问题的代码行。这应该让你更接近于弄清楚发生了什么(或者至少能够问下一个问题)。在创建 StackOverflow 之前,我们就是这样解决此类问题的 ;-) 祝你好运!
-
在
malloc之后看不到对 NULL 的检查。strdup也会更有表现力
标签: c function pointers memory memory-management