如何释放字符串文字所消耗的内存?

时间:2015-10-22 13:01:42

标签: c memory-management string-literals

如果char*不再有用,我如何释放struct使用的所有内存?

我有一些struct information { /* code */ char * fileName; }

char*

我显然要在fileName中保存一个文件名,但在使用一段时间之后,我想释放以前的内存,我该怎么做?

E:我不是要释放指针,而是<meta http-equiv="cache-control" content="max-age=0" /> <meta http-equiv="cache-control" content="no-cache" /> <meta http-equiv="expires" content="0" /> <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> <meta http-equiv="pragma" content="no-cache" /> 指向的空间,这很可能是一个字符串文字。

2 个答案:

答案 0 :(得分:7)

有多个字符串“类型”fileName可能指向:

  1. malloccallocrealloc返回的空格。在这种情况下,请使用free

  2. 字符串文字。如果您指定info.fileName = "some string",则无法办理。字符串文字本身写在可执行文件中,通常与程序代码一起存储。有一个原因只能由const char*访问字符串文字,而C ++只允许const char*指向它们。

  3. 堆栈上的字符串,如char str[] = "some string";。使用花括号来限制其范围和生命周期:

    struct information info;
    {
        char str[] = "some string";
        info.fileName = str;
    }
    printf("%s\n", info.fileName);
    

    printf调用导致未定义的行为,因为str已经超出范围,因此该字符串已被解除分配。

答案 1 :(得分:1)

您可以使用foo.fileName = malloc(howmanychars);free(foo.fileName);

如果从字符串文字或其他非动态分配的方式初始化fileName,则无法释放内存。

但是,除非你需要大量的这样的结构/文件名,否则释放少量字节就是毫无意义的。操作系统可能将释放的内存返回给其他进程;返回的内存可能可用于进程的未来内存分配。