在C中对分配的指针执行malloc安全吗?

在C中对分配的指针执行malloc安全吗?,c,memory-management,memory-leaks,C,Memory Management,Memory Leaks,我在一个C库上工作,并且在内存管理方面非常谨慎。我有一个为指针分配内存的函数,我试图说明指针已经被分配的情况。我想知道在分配指针之前是否需要释放指针 char*x=(char*)malloc(12); // ... 免费(x); x=(char*)malloc(12); 我不确定免费(x)是否必要。是的免费(x)是必要的。如果删除该选项,则下次malloc(12)时肯定会泄漏内存。现在,如果大小确实相同,那么我怀疑您是否真的需要第二个malloc。如果大小不同,您可以使用realloc()并删

我在一个C库上工作,并且在内存管理方面非常谨慎。我有一个为指针分配内存的函数,我试图说明指针已经被分配的情况。我想知道在分配指针之前是否需要释放指针

char*x=(char*)malloc(12);
// ...
免费(x);
x=(char*)malloc(12);

我不确定免费(x)是否必要。

是的免费(x)是必要的。如果删除该选项,则下次
malloc(12)
时肯定会泄漏内存。现在,如果大小确实相同,那么我怀疑您是否真的需要第二个
malloc
。如果大小不同,您可以使用
realloc()
并删除
free
是的
free(x)
。如果删除该选项,则下次
malloc(12)
时肯定会泄漏内存。现在,如果大小确实相同,那么我怀疑您是否真的需要第二个
malloc
。如果大小不同,可以使用
realloc()
并删除
空闲的

没有分配的指针

char*x=(char*)malloc(12)
声明一个指针
x
。然后它分配12字节的内存,并使
x
指向12字节的内存

免费(x)释放12字节的内存
x
仍然指向现在已释放的12字节内存

x=(char*)malloc(12)
分配另外12个字节的内存,并使
x
指向新的12个字节的内存


如果您删除了免费的
(x)那么您将分配2批12字节的内存,而不是释放第一批内存。这是否是内存泄漏取决于您的程序应该如何工作-如果您没有将内存用于某些事情,这只是内存泄漏。

没有分配的指针

char*x=(char*)malloc(12)
声明一个指针
x
。然后它分配12字节的内存,并使
x
指向12字节的内存

免费(x)释放12字节的内存
x
仍然指向现在已释放的12字节内存

x=(char*)malloc(12)
分配另外12个字节的内存,并使
x
指向新的12个字节的内存


如果您删除了免费的
(x)那么您将分配2批12字节的内存,而不是释放第一批内存。这是否是内存泄漏取决于程序的工作方式——如果您没有将内存用于某些事情,这只是内存泄漏。

这是安全的,也就是说:您没有发生任何未定义的行为。但是如果您没有保存第一个
malloc()
给定的地址,那么您正在泄漏内存,因为它在以后的某个时候应该是
free()
d

不执行
free()
并不危险,但您无法从该状态恢复,因为您丢失了对该内存块所在的内存的引用,因此以后无法返回它(这是
free()
要求的


如果您不控制返回给您的内存,并且您的程序执行这种行为,您最终可能会耗尽进程可用的所有内存,这可能会影响整个系统。

这是安全的,也就是说:您不会发生任何未定义的行为。但是如果您没有保存第一个
malloc()
给定的地址,那么您正在泄漏内存,因为它在以后的某个时候应该是
free()
d

不执行
free()
并不危险,但您无法从该状态恢复,因为您丢失了对该内存块所在的内存的引用,因此以后无法返回它(这是
free()
要求的


如果您不控制返回给您的内存,并且您的程序执行这种行为,您最终可能会耗尽进程可用的所有内存,这可能会影响整个系统。

当然,您可以为指针动态分配内存
char**p_to_char=malloc(sizeof(char*)):char*p_char=*p_to_char。当然,没有人会这样做。指针在传递到
free
后,不应被视为仍然指向上一个内存。根据C 2018 6.2.4,“当指针指向(或刚刚过去)的对象到达其生命周期结束时,指针的值变得不确定。”因此,在
free(x)之后,x没有确定的值。在使用扁平地址空间的常见C实现中,代码的行为通常可能类似于
x
指向先前分配的内存。但是在使用复杂寻址方案的实现中,
x
的值可能会改变。在任何实现中,优化都可能使它看起来像是
x
发生了变化。@Jonathan我不想说“那将是内存泄漏”,因为从这里的代码无法判断它是否真的是内存泄漏。如果有另一个指针指向内存,则不一定是内存泄漏。@JonathanLeffler the
/…
可以很容易地包含类似于
currentX=xchar**p_to_char=malloc(sizeof(char*)):char*p_char=*p_to_char。当然,没有人会这样做。指针在传递到
free
后,不应被视为仍然指向上一个内存。根据C 2018 6.2.4,“当指针指向(或刚刚过去)的对象到达其生命周期结束时,指针的值变得不确定。”因此,在
free(x)之后,x没有确定的值。在使用扁平地址空间的常见C实现中,代码ma