如何在c中使用free()函数?

时间:2018-11-08 08:34:01

标签: c memory error-handling free

我正在程序中使用此功能:

static void free_envp(char **envp)
{
    free(envp);
}

我无法弄清楚应该如何管理错误以及可能发生的错误,无论是在线还是在手册页中。

有人知道我应该使用它吗?

2 个答案:

答案 0 :(得分:3)

调用free函数以释放已在堆上分配的内存。即通过malloccallocrealloc

您应该将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