释放一个空指针的内存是否必要?

3

我想知道,如果我有以下代码:

var = (double *)calloc(vars_ptr->amount, sizeof(double));
if (var == NULL) {
     printf("ERROR: Problem in memory allocation");
     exit(1);
}

在退出时没有释放内存,这是否可能导致内存泄漏?因为这意味着内存分配过程并没有发生。


1
如果您没有分配,怎么可能释放? - machine_1
1
不要忘记将错误消息写入stderr并以一个下划线结尾。没有内存被分配,因此没有泄漏。 - Jonathan Leffler
1
我不认为这是一个完全重复的。 - melpomene
@JonathanLeffler:错误消息确实应该直接传达给用户,但是获得这条直线的方法是使用新行。 - Eric Postpischil
1
我应该直接前往换行符,@EricPostpischil。我认为这是因为使用了装备有完全功能的拼写错误修正器的iPhone时咖啡因不足所致。 - Jonathan Leffler
6个回答

2
如果没有分配任何内存,你不需要释放任何东西。
话虽如此,free(NULL)并不会有害。它只是什么也不做。
另外,在退出之前释放内存是没有意义的。这不是内存泄漏;泄漏是不释放内存并继续运行。
最初的回答:如果没有分配内存,则无需释放任何内容。free(NULL)并不会有害,只是什么也不做。此外,在退出之前释放内存是没有意义的,这不是内存泄漏,泄漏是指不释放内存并继续运行。请注意,保留HTML标签。

1

你的问题有点混淆:

  • 如果你在问是否应该在退出程序之前调用free(var),那么显然不必要,因为当内存分配失败时,var == NULL。在var中没有任何需要释放的内容。调用free(var)是允许的,但不会做任何事情。
  • 如果你在问是否应该在发生致命错误的情况下退出程序之前释放程序分配的其他内存块,这也是不必要的,因为操作系统分配给程序的所有内存在退出时都会被释放。
  • 其他系统资源(如打开的文件、锁、信号量等)也应该自动释放,但是通过这种方式突然退出程序可能会使环境处于不一致状态。例如,你可能会留下一些内容不一致的文件、未删除的临时文件、未完成的网络事务、不一致的数据库更新等。

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()

来自C标准

7.20.3.2 The free function

#include <stdlib.h>
void free(void *ptr);

The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation.
If ptr is a null pointer, no action occurs.


1
如果返回的指针等于NULL,则意味着内存未分配。
来自函数(C11标准)的描述
3 calloc函数返回空指针或分配空间的指针。
您可以为null指针调用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;
}

使用内联编译器,输出其结果。
p = 0x55efd9c81260

尽管所需的内存大小为0,但系统分配了需要释放的内存。

1
当您调用malloccalloc时,如果调用返回NULL,则表示没有分配任何内容,因此不需要释放任何内容,也不会出现内存泄漏。
您需要担心的情况涉及realloc
newp = realloc(oldp, newsize);

如果realloc返回NULL,那么oldp仍然指向旧的内存(如果有的话)。如果您要编写...
p = realloc(p, newsize);

这将成为一个内存泄漏的威胁,因为如果第一次realloc失败,p会包含NULL,旧的、仍然有效的指针将丢失。

0

你上传的代码分配了内存,但没有释放。

根据http://www.cplusplus.com/reference/cstdlib/calloc/https://www.tutorialspoint.com/c_standard_library/c_function_calloc的信息 - 如果函数无法从操作系统中分配内存,则calloc返回NULL。因此,在函数调用后检查指针是一个好习惯,以避免。

我认为,如果函数失败,要么你尝试分配太多内存,要么已经发生了内存泄漏,所以我不会担心在失败后退出代码 - 这可能是最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接