0

我用 C 写了一个简单的计数器结构:

typedef struct{
    int value;
}Counter;

然后,我写了一些简单的实现:

void createCounter(Counter *dCount)
{ 
    dCount = (Counter*)malloc(sizeof(Counter));
    dCount->value = 0;
}

void FreeResource(Counter *dCount)
{
  free(dCount);
}

现在主要是,我想释放我创建的指针,它抱怨没有分配被释放的指针。我正在查看代码,我想我在调用 createCounter() 函数时为它分配了内存?

 int main()
  {
    Counter m;
    CreateCounter(&m);
    FreeResource(&m); //run time error given here..

    return 0;
 }
4

3 回答 3

4
dCount = (Counter*)malloc(sizeof(Counter));

有多个问题:

  • dCount = ...对调用者绝对没有影响,即指针不变。
  • 你传递了一个指向已经分配的结构的指针,你不需要malloc任何东西
  • 你正试图释放一些&m你没有从中获得的东西 ( )malloc

在这一点上,唯一明智的建议是复习关于指针的一章。

于 2012-07-27T13:03:12.403 回答
4

您正在尝试传递在堆栈中分配的变量的地址,然后尝试将 malloc 分配的地址分配给它,这不会反映在调用者中。因此,当您尝试释放它时,您实际上是在将堆栈变量的地址传递给 free,因此您会得到未定义的行为。

改变功能

void createCounter(Counter *dCount) 
{      
    dCount = (Counter*)malloc(sizeof(Counter));    
    dCount->value = 0; 
} 

作为

void createCounter(Counter **dCount) 
{      
   *dCount = (Counter*)malloc(sizeof(Counter));     
   (*dCount)->value = 0; 
} 

在您的情况下,指针按值传递,新的内存地址分配不会反映在调用者中。

主要功能必须更改为:

int main()     
{       
  Counter *m;       
  CreateCounter(&m);       
  FreeResource(m); //run time error given here..          
  return 0;    
}   
于 2012-07-27T13:03:43.273 回答
4

问题是在CreateCounter变量dCount中是一个局部变量。这意味着当函数返回时,对变量的更改将不可见。

有两种常见的解决方案:

  1. 返回指针:

    Counter *CreateCounter()
    {
        Counter *dCounter = malloc(sizeof(Counter));
        dCounter->value = 0;
        return dCounter;
    }
    
  2. 将参数作为引用传递,即指向指针的指针:

    void CreateCounter(Counter **dCounter)
    {
        *dCounter = malloc(sizeof(Counter);
        (*dCounter)->value = 0;
    }
    

    并称之为:

    Counter *m;
    CreateCounter(&m);
    
于 2012-07-27T13:04:18.163 回答