我想知道,如果我有以下代码:
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");
exit(1);
}
在退出时没有释放内存,这是否可能导致内存泄漏?因为这意味着内存分配过程并没有发生。
free(NULL)
并不会有害。它只是什么也不做。free(NULL)
并不会有害,只是什么也不做。此外,在退出之前释放内存是没有意义的,这不是内存泄漏,泄漏是指不释放内存并继续运行。请注意,保留HTML标签。你的问题有点混淆:
free(var)
,那么显然不必要,因为当内存分配失败时,var == NULL
。在var
中没有任何需要释放的内容。调用free(var)
是允许的,但不会做任何事情。不要,这个
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.
#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
malloc
或calloc
时,如果调用返回NULL,则表示没有分配任何内容,因此不需要释放任何内容,也不会出现内存泄漏。realloc
:newp = realloc(oldp, newsize);
realloc
返回NULL,那么oldp
仍然指向旧的内存(如果有的话)。如果您要编写...p = realloc(p, newsize);
realloc
失败,p
会包含NULL
,旧的、仍然有效的指针将丢失。你上传的代码分配了内存,但没有释放。
根据http://www.cplusplus.com/reference/cstdlib/calloc/和https://www.tutorialspoint.com/c_standard_library/c_function_calloc的信息 - 如果函数无法从操作系统中分配内存,则calloc返回NULL。因此,在函数调用后检查指针是一个好习惯,以避免。
我认为,如果函数失败,要么你尝试分配太多内存,要么已经发生了内存泄漏,所以我不会担心在失败后退出代码 - 这可能是最好的选择。
stderr
并以一个下划线结尾。没有内存被分配,因此没有泄漏。 - Jonathan Leffler