[英]How to free a char* that will be returned?
说我有以下功能:
char* fakeTrim(char* input) {
char* temp = malloc(strlen(input));
int count = 0;
for(int i = 0; i < strlen(input); i++) {
if(input[i] != ' ')
temp[count++] = input[i];
}
temp[count] = '\0';
return temp;
}
温度会引起内存泄漏吗? 如果是这样,是否有可能在我们返回温度之前将其释放?
谢谢!
不可以,只有在不再需要引用已分配的内存时才可以释放它,这意味着调用者需要释放返回的值(并且您应该在函数的文档中提及这一点)。
顺便说一句,您将在temp[count] = '\\0';
获得一个超出范围的数组引用temp[count] = '\\0';
如果输入字符串中没有空格,则应再分配一个字节。 (并且trim
通常不会删除内部空间,但这也许就是为什么您将其称为fakeTrim
。)
不,您当然不能释放属于您要返回的数据的内存。 确实,在这样的实用程序函数中分配内存会使内存泄漏的可能性极高。 由于调用者看不到功能主体,因此忘记释放该功能主体将非常容易。 实际上,有一个解决此问题的标准方法,那就是让调用者自己分配内存:
void fakeTrim(const char* input, char* temp) {
int count = 0;
for(int i = 0; i < strlen(input); i++) {
if(input[i] != ' ')
temp[count++] = input[i];
}
temp[count] = '\0';
}
现在内存泄漏仍然有可能,但这不是“您的错”-调用者应该知道释放他分配的内存。 注意,在签名中添加const
可以使输入哪个参数和输出哪个参数变得清晰。
编辑:这是一个用例:
const char* input = "Hello world";
char* temp = malloc(strlen(input)+1);
fakeTrim(input, temp);
// ... do something with temp
free(temp);
是的,确实温度会导致内存泄漏。
但是,对于您的要求,我有另一种解决方案。 您可以在调用方函数中使用动态变量,方法是使用按引用传递,然后将其从调用方函数本身释放(无需从调用的函数中释放动态变量)。 请看下面:
void main()
{
char *test;
setVal(test);
puts(test);
if(test){
free(test);
test = NULL;
}
}
void setVal(char **data)
{
char retry[100]="This is test";
char *ret;
ret = malloc((strlen(retry))*sizeof(char));
if(ret == NULL)
exit(1);
strncpy(ret, retry, strlen(retry));
*data = ret;
}
如果您仍然不满意。 使用我与VALGRIND一起提供的示例代码来查看是否存在内存泄漏。
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.