1

如何释放用于 C 中变量(例如长字符串)的内存?

4

5 回答 5

13

假设您动态分配内存(使用malloc或其他内存分配器),您可以使用free. 如果内存是静态分配的,则无法释放它。

于 2008-10-11T18:44:51.490 回答
1

这真的取决于你如何声明你的变量 - 如果它是一个常规变量,你不能“释放”它的内存 - 当它超出范围时它将被释放,如下所示:

for (int i=0;i<10;i++) {
 int k=i;
 //do stuff
}

i 将在您退出循环时被释放,并且 k 将在每次通过循环体时被分配和释放。

当涉及运行时内存分配时,您可以使用值得信赖的 malloc 和 free :)

int* intArray;
malloc(200 * sizeof(int));

这将为您提供 200 个整数的数组。

于 2008-10-11T18:53:50.037 回答
1

假设您没有使用 malloc,并且正在使用创建字符串或缓冲区

char array[100];

但是你知道你只是将它用于长函数的一小部分,你可以将函数的那部分放在另一组 { }

int reallylongfunction() {
    // Do a lot of stuff
    {
        char stringbuffer[100];
        // Do stuff with the buffer...
        // Ok, we're done with the buffer, and don't want it anymore
    }
    // Do a lot more stuff
    return;
}

这将导致缓冲区超出范围并被释放。不过要小心,你在额外的 { } 中声明的任何其他内容都会超出范围并消失!

编辑:该死的,评论是对的。超出范围的静态字符串没有任何好处。编辑所以它只是一个数组。

于 2008-10-11T18:57:52.540 回答
1

如果没有更多信息,这个问题真的无法回答。知道如何释放对象(甚至知道是否应该释放)的唯一方法是知道对象是如何分配的。

当我说对象时,我指的不仅仅是 C++ 的“对象”,而是 C 标准中使用的“对象”:

执行环境中的数据存储区域,其内容可以表示值

于 2008-10-12T00:24:30.743 回答
0

我建议您看一下ustr,这是一个字符串 API,您可以将其与自动、常量和动态分配的字符串一起使用……您实际上可以“免费”使用其中两个,但所有这些都可以处理同样的方式并传递给 ustr_free()。

您可能仍然想了解堆栈、堆和数据(RO 文本字符串)是如何“分配”和“释放”的......但是在学习时使用可用的 API 将停止对您有很大帮助(并且会比你自己做的要快得多)。

于 2008-10-11T22:35:44.223 回答