所以我正在阅读一些类的代码,我对如何在C中释放变量感到困惑.
给出的代码是
#include<stdio.h>
main () {
    int n=0; 
    char *p = "hello world";
    while (*p!= 0)  {   // *p != '\0';
        putc(*p, stdout);
        p++;
    }
    printf("\np = %d", *p);
    printf("\np = %d\n", p);
}
所以我得到你不需要为char*释放任何内存,因为没有mallocs正在发生,但我不明白为什么这段代码不会泄漏任何内存...如果你正在增加一个字符串的指针和因此,将指针移动到下一个内存块(1字节),然后你不会丢失初始引用和你增加的所有参考点吗?如果没有参考点,将如何回收此内存,除非在此类操作发生之前编译器保存了一个内存.我很欣赏有关如何回收这些的一些见解!
AnT*_*AnT 13
解除分配内存的任务强加给该内存的所有者.仅仅因为你有一个指向某个内存区域的指针并不意味着你拥有那个内存,因此,并不意味着你负责释放它.
字符串文字"hello world"是具有静态存储持续时间的对象.它存储在静态存储器中.静态内存始终归运行时环境所有.运行时环境知道存储在静态存储器中的数据.运行时环境知道何时必须释放该数据(这很容易,因为静态内存基本上"从未"被释放 - 只要程序运行就存在).
所以,再次,你的指针p并不真正拥有静态区域中的任何内存.你碰巧用你的内容来引用那个记忆p.担心释放内存不是您的事.当时间到来时(即程序结束时)它将被正确释放,并且在没有你和指针的任何帮助的情况下正确地完成它p.您可以根据需要更改自己p,可以指向完全不同的内存位置,也可以不加任何保留地丢弃它.非正式地说,没有人关心你的p.
您可能在C程序中拥有的唯一内存是您个人分配的内存malloc(或其他动态内存分配函数).因此,您必须记住最终调用free您自己分配的内存(并且您必须确保知道返回的原始值malloc以传递给它free).所有其他类型的内存(如静态或自动)永远不会归您所有,这意味着释放它不是您的业务,保留原始指针值是完全没有必要的.
Jon*_*ler 11
您没有泄漏任何内存,因为您没有动态分配任何内存.内存泄漏来自于不释放动态分配的内存.本地分配的内存(像char *p)或静态分配的内存(如字符串"hello world"是p最初指向的)不能有助于泄漏.