我有一个调用另一个函数的函数,该函数创建一个唯一的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的字符串?我还需要吗?还是有更好的方法来做这件事?
提前感谢。
答案 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];
注意:
char
数组大小舍入到8的倍数,因为结构
填充无论如何都会浪费字节。\n
,因为拥有换行符似乎不对
一个唯一ID中的字符,但当然可以将其添加回来。如果你真的喜欢这个功能,并希望保留它,那么请替换
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;
}
这将在复制后释放内存。