用于在C中返回值的空闲内存

时间:2015-02-27 01:06:56

标签: c memory-management return malloc free

我有一个调用另一个函数的函数,该函数创建一个唯一的ID并通过malloc()将其作为字符串返回。

我的问题是如何在函数外部释放内存?或者做我想做的更好的方法是什么。

我要求ID的函数:

void addCustomer(TennisStoreType* ts){

   CustomerNodePtr newcustdata;
   int datapos = 0;

   newcustdata = malloc(sizeof(CustomerNodeType));

   while (datapos <= CUSTDATA_POSITIONS) {

      char userinput[BUFFER_SIZE];

      switch (datapos) {
         case 0:
            strcpy(newcustdata->custID, createCustID(ts));
            break;
   }
}

返回uniqueID的函数:

char* createCustID(TennisStoreType* ts) {

   char *custID;

   custID = (char *)malloc(CUSTID_LEN + 1 * sizeof(char));

   if (ts->customerCount + 1 >= FOURDIGITS) {
      sprintf(custID, "C%i\n", ts->customerCount + 1);

   } else if (ts->customerCount + 1 >= THREEDIGITS){
      sprintf(custID, "C0%i\n", ts->customerCount + 1);

   } else if (ts->customerCount + 1 >= TWODIGITS) {
      sprintf(custID, "C00%i\n", ts->customerCount + 1);

   } else {
      sprintf(custID, "C000%i\n", ts->customerCount + 1);
   }

   return custID;
}

那么我将如何释放已复制到newcustdata-&gt; custID的字符串?我还需要吗?还是有更好的方法来做这件事?

提前感谢。

2 个答案:

答案 0 :(得分:1)

你的createCustID()函数将分配一些内存,然后通过返回从malloc()获得的指针将其返回给调用者。

调用例程,当它完成结构时,可以(并且必须)通过将相同的指针传递给free()来释放内存。

在您的示例中,您需要扩展addCustomer()中的逻辑以保留从createCustID()接收的指针足够长的时间(1)测试它不为null,(2)如果需要,在本地复制内容, (3)释放收到的街区。

正如其他人所指出的那样,您可能会发现将接收到的块构建到您正在组装的数据结构中更有效,而不是复制它。但是,您仍然需要释放块作为逻辑的一部分来处理更大的数据结构。

您需要使用此类代码仔细规划代码路径,以便始终了解谁拥有&#34;分配的块,并负责在不再需要时释放它。

此外,您必须始终检查malloc()的返回值是否为null。如果malloc无法为您提供所需的内存,则需要适当地处理错误;不只是伪造将数据写入空指针。

答案 1 :(得分:1)

您可以完全消除该功能。这条线

strcpy(newcustdata->custID, createCustID(ts));

可以简单地写成

sprintf( newcustdata->custID, "C%04d", ts->customerCount + 1 );

当然,custID是一个至少包含6个字符的数组,例如

char custID[8];

注意:

  1. 我通常将char数组大小舍入到8的倍数,因为结构 填充无论如何都会浪费字节。
  2. 我删除了\n,因为拥有换行符似乎不对 一个唯一ID中的字符,但当然可以将其添加回来。

  3. 如果你真的喜欢这个功能,并希望保留它,那么请替换

    switch (datapos) {
       case 0:
          strcpy(newcustdata->custID, createCustID(ts));
          break;
    }
    

    用这个

    char *temp;
    switch (datapos) {
       case 0:
          temp = createCustID(ts);
          strcpy(newcustdata->custID, temp);
          free( temp );
          break;
    }
    

    这将在复制后释放内存。