说我有以下功能:
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;
}
温度会导致内存泄漏吗? 如果是这样,是否有可能在我们返回临时之前释放它?
谢谢!
答案 0 :(得分:3)
不,你只能在不再需要引用时释放已分配的内存,这意味着调用者需要释放返回的值(你应该在函数文档中提到这一点)。
顺便说一句,如果你的输入字符串中没有空格,你将在temp[count] = '\0';
上得到一个越界数组引用,所以你应该再分配一个字节。 (并且trim
通常不会移除内部空格,但也许这就是您调用fakeTrim
的原因。)
答案 1 :(得分:1)
不,当然,您无法释放属于您返回的数据的内存。事实上,在像这样的实用程序函数中分配内存极有可能导致内存泄漏;由于呼叫者不会看到功能体,因此她很容易忘记释放它。实际上有这个问题的标准解决方案,那就是让调用者自己分配内存:
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);
答案 2 :(得分:0)
是的,确实会导致内存泄漏。
但是,我有一个替代解决方案,以满足您的要求。 您可以通过使用传递引用来使用调用函数中的动态变量,然后将其从调用函数本身释放(无需将其从被调用函数中释放)。请参阅以下内容:
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中提供的示例代码来查看是否存在任何内存泄漏。
希望它有所帮助。