在C中对分配的指针执行malloc安全吗?
我在一个C库上工作,并且在内存管理方面非常谨慎。我有一个为指针分配内存的函数,我试图说明指针已经被分配的情况。我想知道在分配指针之前是否需要释放指针在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()并删
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=x当然,您可以为指针动态分配内存char**p_to_char=malloc(sizeof(char*)):char*p_char=*p_to_char代码>。当然,没有人会这样做。指针在传递到free
后,不应被视为仍然指向上一个内存。根据C 2018 6.2.4,“当指针指向(或刚刚过去)的对象到达其生命周期结束时,指针的值变得不确定。”因此,在free(x)之后代码>,x没有确定的值。在使用扁平地址空间的常见C实现中,代码ma