是否可以释放一个用calloc分配的char *"

时间:2017-07-28 14:33:03

标签: c string free calloc

我想知道是否可以免费使用char *分配calloc(字符串),但有几次。

char * signal;  

for (int i = 0 ; i < n ; i++)  {   
   signal = (char*) calloc(n, sizeof(char));
   if (a = true) {
      signal[i] = 1;
   }

   /* do stuff */

   free(signal); /* error here : double free or corruption */   
}

为什么我会在free()上收到错误?

4 个答案:

答案 0 :(得分:1)

  

想知道是否可以释放一个用calloc分配的char *(字符串),但是几次。

简答:否

答案很长:打电话给malloc()calloc()realloc(NULL, ...) (* 1)允许(需要,不要泄漏内存)一个调用free()将值传递给后者,由前者之一返回。

因此,如果将已经free()的ed地址传递给free()并假设在上一次调用free()之后没有被另一个分配返回,那么代码会调用未定义的行为,从那时起,任何事都会发生。

(* 1)关于realloc()的注释:

  • realloc()未传递NULL的连续调用不会增加对free()的必要调用总和。换句话说

    char * p = malloc(42);
    p = realloc(43);
    

    只需要一次调用free()

    free(p);
    
  • NULL传递给realloc()会使realloc()计为对malloc()的调用。

    否则

    char * p = realloc(NULL, 42); 
    

    与做

    相同
    char * p = malloc(42);
    

答案 1 :(得分:0)

内部malloccalloc都应该做同样的事情来分配内存(正如realloc所做的那样)。唯一的区别是memset中对calloc的调用。因此,如果您想避免内存泄漏,那么您使用calloc分配的内存必须传递给free

答案 2 :(得分:0)

只有一个C函数用于释放动态分配的内存。该函数为Bootstrap-3-Typeahead,它可以,应该而且必须用于释放使用free()malloc()calloc()分配的任何内存块。

您发布的代码似乎没问题。如果你的内存损坏,则来自你没有发布的代码。

答案 3 :(得分:0)

以下提议的代码

  1. 干净地编译
  2. 干净利落地链接
  3. 不会产生任何运行时问题
  4. 现在是代码

    #include <stdlib.h>   // calloc(), free()
    
    int main( void )
    {
        char * signal;
        size_t n = 10;
        int a = 1;
    
        for (size_t i = 0 ; i < n ; i++)
        {
           signal = calloc(n, sizeof(char));
           if (a)
           {
              signal[i] = 1;
           }
    
           /* do stuff */
    
           free(signal); /* error here : double free or corruption */
        }
    }
    

    这表示您遇到的问题是由do stuff区域中的某些内容造成的。

    我要看的一件事是:检查signal中的任何'索引'是否永远不会低于0并且永远不会超过n-1,因为任何一个错误都会破坏堆。损坏的堆(通常)会导致对free()的调用失败。

    同时检查指针signal的内容是否永远不会被do stuff更改,因为这也会导致调用free()失败。