如果我有这个函数foo()
,我从另一个函数foo2()
调用它;我必须像这样释放调用函数中的内存吗?
char *foo(char *str1){
char *str2;
str2 = malloc((sizeof(char) * strlen(str1)) + 1);
memcpy(str2, str1, strlen(str1) + 1)
return str2;
}
void foo2(void){
char *str1 = "Hello world!"
char *str2;
str2 = foo(str1);
...some stuff
free(str2); //Should I do this here?
}
答案 0 :(得分:4)
是的,除非你没有测试你的malloc是否成功
答案 1 :(得分:2)
你可以释放分配的内存,因为你做了分配,分配成功了,内存还没有被释放。
答案 2 :(得分:2)
是的,这会有效,但是你有一个错误:
char *foo(const char *str1)
{
char *str2 = (char *)malloc((sizeof(char) * strlen(str1)) + 1);
if (str2 != NULL)
memcpy(str2, str1, strlen(str1) + 1);
return str2;
}
void foo2
{
char *str1 = "Hello world!"
char *str2;
str2 = foo(str1);
...some stuff
free(str2);
}
传统上,您会记录调用者负责使用free()
释放返回的指针的事实。
此外,您的foo()
功能只不过是strdup()
。
答案 3 :(得分:1)
是。需要在某些时候释放内存。如您所见,您现在在foo
函数与其任何调用者之间存在紧密耦合。一种常见的替代方法是传入指向char
数组及其大小的指针。然后该函数返回它是否正确填充数组。这将分配和释放的责任转移给调用者。
bool * foo(char * str, size_t size)
{
if(size < FOO_REQUIRED_SIZE) {
return FALSE;
} else {
...
return TRUE;
}
}
void foo2(void)
{
char str[FOO_REQUIRED_SIZE];
foo(str, ARRAY_SIZE(str));
}
如果函数失败,您可以进一步记录所需的数组大小,而不是简单地返回FALSE
。或者,也可以提供计算所需尺寸并返回的功能。
size_t getRequiredBufSizeForFoo()
{
// Calculate how many bytes required
return ...;
}
void foo2(void)
{
size_t len = getRequiredBufSizeForFoo();
char str[len];
foo(str, len);
}
答案 4 :(得分:1)
是的,这是对的。 foo()
分配一些内存,并且必须由调用者释放。它不是一个非常好的设计,但它的工作原理。如果foo()
接受两个参数:输出缓冲区及其大小,可能会更好。
void foo(char* input, char* output, int* bufferSize);
如果输出为NULL
,则bufferSize
将foo()
写入所需的大小。