在分配指针之前和之后将指针设置为NULL之间有区别吗?
例如,
之间有什么区别吗?char* c = NULL;
和
char* c = malloc(sizeof(char));
c = NULL;
每个陈述的含义是什么(如果有的话),在每种情况下调用free(c)
有什么不同?
答案 0 :(得分:7)
让我们看看这两种情况。
嗯,这里几乎没有伤害。除非指针之前指向某个东西,否则指针只会设置为NULL并指向任何内容。在指向任何内容的指针上调用free()
无效。 “解放人民?”好的。 “免费免费?”你不能真正释放那些已经“免费”的东西。没有陌生人,没有危险。继续......
让我们分解一下:
char* c = malloc(sizeof(char));
c = NULL;
第一个命令将为您的程序从操作系统保留内存。这是动态分配 - 动态获取更多内存。
第二个命令将指针设置为NULL。那是什么意思? 内存泄漏。 这意味着您的程序基本上已经从操作系统借用内存而忘记了它。 这是一个很大的禁忌。如果程序一遍又一遍地执行,它们最终会崩溃(或整个系统崩溃)。
就像你应该总是把东西归还给朋友一样,你应该总是将内存返回给操作系统。因此,你必须始终为free()
的每个点调用malloc()
};就像在C或C ++中打开和关闭方括号(),[]或{}一样。
答案 1 :(得分:4)
是的,有区别。第二个导致内存泄漏。
关于您的第二个问题,如果c = NULL
,那么free(c)
将无效。
答案 2 :(得分:4)
在分配之前,它可能具有(取决于它被声明的位置)垃圾数据。通过在之前将其指定为null,您基本上可以确保它处于已知的良好状态。
在为变量分配和分配地址后,将指针设置为null意味着指针将不再引用分配的内存。通常这会造成内存泄漏(一些分配的内存不能再被引用,因此无法释放)。但有时候这是合适的。例如,如果您的逻辑有两个对内存的引用,一个用于分配/解除分配目的,另一个用于“当前感兴趣的项目”,则可能适合分配当前感兴趣的项目,然后为其分配null作为此“当前项目”感兴趣的“指针与内存分配和释放无关。
最后,如果它是一个用于释放的指针,在指针free()
之后,您可能希望将指针设置为null,原因与在分配之前将指针设置为null的原因相同(确保您的程序不会因为在您不想访问的内存时找到指针中的地址值而感到困惑。
答案 3 :(得分:3)
您没有将分配的内存设置为NULL,而是将指针设置为NULL,以便它不再指向您分配的内存。当你在它上面调用free
时,你没有释放你分配的内存,因为指针没有指向它。
这称为内存泄漏:你已经分配了一些内存,但你不再有一个指向它的指针,所以你不能释放它,所以内存将保持“正在使用”并且对其他程序不可用,即使你实际上不再使用它了。
在NULL指针上调用free
无效。