我有一个函数调用另一个函数,该函数创建一个唯一的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%in", ts->customerCount + 1);
} else if (ts->customerCount + 1 >= THREEDIGITS){
sprintf(custID, "C0%in", ts->customerCount + 1);
} else if (ts->customerCount + 1 >= TWODIGITS) {
sprintf(custID, "C00%in", ts->customerCount + 1);
} else {
sprintf(custID, "C000%in", ts->customerCount + 1);
}
return custID;
}
那么,我该如何释放已复制到newcustdata->custID的字符串呢?我需要吗?或者有更好的方法吗?
提前谢谢。
您可以完全消除该函数。线路
strcpy(newcustdata->custID, createCustID(ts));
可以简单地写为
sprintf( newcustdata->custID, "C%04d", ts->customerCount + 1 );
当然,假设custID
是至少6个字符的数组,例如
char custID[8];
注:
- 我通常将
char
阵列大小舍入为8的倍数,因为结构无论如何,填充都会浪费字节 - 我删除了
n
,因为它似乎没有换行符字符,但您当然可以将其添加回中
如果你真的喜欢这个功能,并想保留它,那么就更换
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;
}
这将在复制后释放内存。
createCustID()函数将分配一些内存,然后通过返回从malloc()获得的指针将其返回给调用者。
调用例程在处理完结构后,可以(也必须)通过将相同的指针传递给free()来释放内存。
在您的示例中,您需要扩展addCustomer()中的逻辑,以保留它从createCustID()接收到的指针足够长的时间,以便(1)测试它是否为空,(2)如果需要,在本地复制内容,以及(3)释放接收到的块。
正如其他人所指出的,你可能会发现,只将接收到的块构建到你正在组装的数据结构中,而不是复制它更有效。然而,你仍然需要释放块,作为处理更大数据结构的逻辑的一部分。
您需要使用这种类型的代码仔细规划代码路径,这样您就可以始终知道谁"拥有"分配的块,并负责在不再需要时释放它。
此外,您必须始终检查malloc()的返回值是否为null。如果malloc没有给您所需的内存,您需要适当地处理错误;而不仅仅是将数据写入空指针。