我想知道我是否有以下代码:
---------------------------------------------------------------------------
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'
是否有可能发生内存泄漏?我的意思是不释放就退出,因为它表明内存分配过程没有发生。
答案 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()
一样。
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)
当您调用malloc
或calloc
且调用返回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。因此,优良作法是在函数调用之后检查指针,以便避免出现错误。
我要说的是,如果函数失败,或者您试图分配过多的内存,或者已经发生了内存泄漏,那么我不必担心失败后退出代码-这可能是为了最好的。