是否需要释放具有空值的已分配指针?

时间:2019-08-10 14:32:53

标签: c memory memory-leaks

我想知道我是否有以下代码:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-29-6cdb09c1b552> in <module>()
----> 1 process_image('IMG_PATH')

<ipython-input-28-1b1187d4c25c> in process_image(img_path)
      3     img_array = image.img_to_array(img)
      4     img_array = np.expand_dims(img_array, axis=0)
----> 5     pImg = MobileNetV2.preprocess_input(img_array)
      6     return pImg

AttributeError: 'function' object has no attribute 'preprocess_input'

是否有可能发生内存泄漏?我的意思是不释放就退出,因为它表明内存分配过程没有发生。

6 个答案:

答案 0 :(得分:2)

如果未分配内存,则不必释放任何内容。

也就是说,free(NULL)无害。它只是无能为力。

也就是说,在您退出之前,释放内存没有任何意义。那不是内存泄漏。泄漏不会释放内存并保持运行。

答案 1 :(得分: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 standard

  

7.20.3.2 free功能

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

free函数使ptr指向的空间为   释放,即可供进一步分配。
  如果 ptr null 指针,则不执行任何操作

答案 2 :(得分:1)

如果返回的指针等于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;
}

使用嵌入式编译器输出

p = 0x55efd9c81260

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

答案 3 :(得分:1)

当您调用malloccalloc且调用返回NULL时,这意味着未分配任何内容,因此无需释放任何内容,也不会发生内存泄漏。

您需要担心的问题realloc

newp = realloc(oldp, newsize);

如果realloc返回NULL,则oldp仍指向旧内存(如果有)。如果你要写

p = realloc(p, newsize);

这将是第一次realloc失败时等待发生的内存泄漏。 (也就是说,p将包含NULL,并且仍然有效的旧指针将丢失。)

答案 4 :(得分:1)

您的问题有点令人困惑:

  • 如果您在退出程序之前询问是否应调用free(var),则显然var == NULL不需要,因为该内存分配失败。 var中没有免费的东西。允许调用free(var),但不会执行任何操作。
  • 如果您要退出此程序分配的其他内存块,然后再退出该程序尝试的致命错误,则致命错误是不必要的,因为操作系统分配给程序的所有内存都会在退出时释放。
  • 其他系统资源(例如打开的文件,锁,信号灯等)也应自动释放,但是您可能会突然退出程序,从而使环境仍然处于不一致状态。例如,您可能会留下一些内容不一致的文件,未删除的临时文件,待处理的网络事务,不一致的数据库更新...

答案 5 :(得分:0)

您上传的代码分配内存,而不是释放内存。

根据http://www.cplusplus.com/reference/cstdlib/calloc/上的信息,  https://www.tutorialspoint.com/c_standard_library/c_function_calloc)-如果函数无法从OS分配内存,则calloc返回NULL。因此,优良作法是在函数调用之后检查指针,以便避免出现错误。

我要说的是,如果函数失败,或者您试图分配过多的内存,或者已经发生了内存泄漏,那么我不必担心失败后退出代码-这可能是为了最好的。