free():在使用递归的C语言中无效的下一个大小(快速)错误



这是我的代码的一部分,这是产生错误。

int check(int size, char *string)
{
     if(condition)
     {             
         char *tempStr = (char*)calloc(size, sizeof(char));                                         
         /*
         some code here to put some string value to tempStr;
         */
         res += check(size,tempStr);
         free(tempStr);
     }
}

我已经阅读并理解了当我们尝试释放不可用的内存或当我们尝试多次释放内存时(假设这是我的情况),会发生无效的next错误。

如何解决上述错误?在递归时,上述方法是否正确释放内存?

free()的man page可以看出,free()的签名为

void free(void *ptr);

所以,在你的代码中,
free(size,tempStr);

是错误的。我担心,您可能错过了stdlib.h头文件本身。这使得下一个注释甚至更有效,

  • 请查看为什么不将malloc()和family的返回值强制转换为C

编辑后:

在前面链接的同一手册页中提到,

free()函数释放了ptr, 所指向的内存空间,这些空间必须是在之前调用malloc(), calloc()或realloc()时返回的。否则,或者如果free(ptr)之前已经被调用过,则会发生未定义行为。

,

     /*
     some code here;
     */

不能更改tempStr。这就是我们所能说的,正如你所展示的代码。

根据你的评论,

"在tempStr中插入字符串"

我的最佳选择是您正在执行类似tempStr = "somesting"(一个分配,而您应该执行strcpy())的操作,这会导致

  1. 丢失malloc() ed内存,造成内存泄漏。
  2. 将非malloc() ed指针传递给free,创建未定义的行为。

C语言中的free函数只有一个形参,即指向free的指针。

通过给它一个大小,比如15,你请求free释放地址15的内存,这个地址没有malloc。

不要忘记包含stdlib.h,这样编译器就会知道它只接受一个参数。(它应该在编译时更正一个警告)

相关内容

  • 没有找到相关文章

最新更新