我正在程序中使用此功能:
static void free_envp(char **envp)
{
free(envp);
}
我无法弄清楚应该如何管理错误以及可能发生的错误,无论是在线还是在手册页中。
有人知道我应该使用它吗?
答案 0 :(得分:3)
调用free
函数以释放已在堆上分配的内存。即通过malloc
,calloc
或realloc
。
您应该将malloc
返回的指针传递给free
函数。由于在某些情况下NULL
可以由malloc
返回,因此可以安全地将NULL
作为参数传递给free
,这样free(NULL)
就什么都不做。 / p>
此外,每个free
仅应调用malloc
函数。在尚未分配或已释放的指针上调用free
是未定义的行为。
因此,如果要再次使用NULL
,则最好在释放int *p;
p = malloc(n * sizeof(int)); // n is size of the array
if (p == NULL)
{
// Take appropriate action, e.g. exit the program.
}
....
.....
// After all use of the memory is over, if allocated properly before.
free(p);
p = NULL;
后再设置一个指针。
@Nullable
public static String streamContainersIntoJsonString(List<Container> containers) {
try {
Gson gson = new Gson();
ByteArrayOutputStream out = new ByteArrayOutputStream();
JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
writer.setIndent(" ");
writer.beginArray();
for (Container container : containers) {
gson.toJson(container, Container.class, writer);
}
writer.endArray();
writer.close();
return out.toString("UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
答案 1 :(得分:1)
envp
参数听起来像是main
定义的一部分的环境指针:
int main(int argc, char *argv[], char *envp[]);
就像argv
一样,您不能取消分配envp
。它由流程环境传递。
(如果您的envp
参数与envp
的{{1}}参数无关,那么您可以忽略我的答案的这一部分)。 < / p>
注意:您向函数传递了一个指向指针的指针,然后对其进行了释放。但是可能应该释放指针的目标:
main