C 是否需要释放具有空值的已分配指针?
我想知道,我是否有以下代码:C 是否需要释放具有空值的已分配指针?,c,memory,memory-leaks,C,Memory,Memory Leaks,我想知道,我是否有以下代码: var = (double *)calloc(vars_ptr->amount, sizeof(double)); if (var == NULL) { printf("ERROR: Problem in memory allocation"); exit(1); } 有可能内存泄漏吗?我的意思是退出而不释放,因为它表明内存分配过程没有发生。否,这 var = (double*)calloc(vars_ptr->amount, si
var = (double *)calloc(vars_ptr->amount, sizeof(double));
if (var == NULL) {
printf("ERROR: Problem in memory allocation");
exit(1);
}
有可能内存泄漏吗?我的意思是退出而不释放,因为它表明内存分配过程没有发生。否,这
var = (double*)calloc(vars_ptr->amount, sizeof(double));
if (var == NULL){
printf("ERROR: Problem in memory allocation");
/* @TODO proper error handling i.e use error no & stderr */
exit(1);
}
不会导致内存泄漏,就像调用calloc()
失败一样,即内存分配失败,即您不必调用free()
从
7.20.3.2免费功能
#include <stdlib.h>
void free(void *ptr);
#包括
无空隙(空隙*ptr);
free
功能使ptr指向的空间
已解除分配,即可供进一步分配。
如果ptr是null指针,则不会发生任何操作
如果没有分配内存,则不必释放任何内容
也就是说,free(NULL)
是无害的。这根本没用
也就是说,在退出之前释放内存是没有意义的。这不是内存泄漏;泄漏不会释放内存并保持运行。您上载的代码分配内存,而不是释放内存
根据和上的信息
)-如果函数未能从操作系统分配内存,则calloc返回NULL。因此,在函数调用后检查指针是一种很好的做法,以避免出现错误
我想说,如果函数失败,要么是您试图分配太多内存,要么是内存泄漏已经发生,因此我不担心在失败后退出代码——这可能是最好的选择。如果返回的指针等于NULL,则这意味着内存未分配
从函数的描述中calloc
(C11标准)
3 calloc函数返回空指针或指向的指针
分配的空间
您可以调用free
以获取空指针,但这不起作用
另一方面,您可能需要零大小的内存。在这种情况下,如果返回的指针不等于NULL,则必须调用free
以释放分配的内存
这是一个演示程序
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p = calloc( 0, sizeof( int ) );
if ( p != NULL )
{
printf( "p = %p\n", ( void * )p );
}
free( p );
return 0;
}
也就是说,虽然所需的内存大小等于0,但是系统分配的内存需要释放。当您调用malloc
或calloc
时,调用返回NULL,这意味着没有分配任何内存,因此不需要释放任何内存,并且没有内存泄漏
在这种情况下,您必须担心问题realloc
:
newp = realloc(oldp, newsize);
如果realloc
返回NULL,则oldp
仍指向旧内存(如果有)。如果你要写
p = realloc(p, newsize);
这将是等待发生的内存泄漏,第一次realloc
失败。(也就是说,p
将包含NULL
,旧的、仍然有效的指针将丢失。)您的问题有点让人困惑:
- 如果您在退出程序之前询问是否应该调用
free(var)
,显然没有必要,因为当此内存分配失败时,var==NULL
。var
中没有可供释放的内容。允许调用free(var)
,但不会执行任何操作
- 如果您正在询问是否应在退出程序之前释放程序分配的其他内存块,并且出现此特定分配尝试的致命错误,则也没有必要这样做,因为操作系统分配给程序的所有内存都会在退出时释放
- 其他系统资源,如打开的文件、锁、信号灯。。。也应该自动释放,但这样突然退出程序仍可能使环境处于不一致的状态。例如,您可能会留下一些内容不一致的文件、未删除的临时文件、挂起的网络事务、不一致的数据库更新
如果您没有分配,您怎么能释放?不要忘记错误消息应该写入stderr
并以直线结束。没有泄漏,因为没有分配内存。我不认为这是完全重复的。@JonathanLeffler:错误消息确实应该直接发送给用户,但获得该直线的方法是使用新行。我应该为新行字符@EricPostphil创建一条直线。我把它归结为在咖啡因含量低的情况下使用了一台配备了全功能咒语管理器的iPhone。
p = realloc(p, newsize);