动态内存分配在c中,释放在使用malloc()之前分配的部分内存
有没有办法释放使用malloc()创建的部分内存 假设:-动态内存分配在c中,释放在使用malloc()之前分配的部分内存,c,dynamic-memory-allocation,C,Dynamic Memory Allocation,有没有办法释放使用malloc()创建的部分内存 假设:- int *temp; temp = ( int *) malloc ( 10 * sizeof(int)); free(temp); free()将释放所有20字节的内存,但假设我只需要10字节。我可以释放最后10个字节。您可以使用标准c库提供的realloc函数 C99标准7.20.3.4-1:realloc功能: realloc函数解除分配ptr指向的旧对象,并返回 指向新对象的指针,该对象的大小由大小指定。新报告的内容 对象应
int *temp;
temp = ( int *) malloc ( 10 * sizeof(int));
free(temp);
free()将释放所有20字节的内存,但假设我只需要10字节。我可以释放最后10个字节。您可以使用标准c库提供的
realloc
函数
C99标准7.20.3.4-1:realloc功能:
realloc函数解除分配ptr指向的旧对象,并返回
指向新对象的指针,该对象的大小由大小指定。新报告的内容
对象应与解除分配前的旧对象相同,以新旧尺寸中较小者为准。新对象中超出旧对象大小的任何字节都有不确定的值
您应该使用标准库函数
realloc
。顾名思义,它重新分配了一块内存。其原型是(包含在标题stdlib.h
)
该函数将ptr
指向的内存块大小更改为size
字节。此内存块必须由malloc
、realloc
或calloc
调用分配。需要注意的是,realloc
可以将旧块扩展到大小
字节,可以保留相同的块并释放额外的字节,或者可以分配一个全新的内存块,将内容从旧块复制到新块,然后释放
旧块
realloc
返回指向重新分配内存块的指针。如果它无法重新分配内存,那么它将返回NULL,并且原始内存块保持不变。因此,在调用realloc
之前,应将ptr
的值存储在临时变量中,否则原始内存块将丢失并导致内存泄漏。此外,您不应强制转换malloc的结果
我认为值得注意的是,
realloc
不一定会释放分配给malloc
的部分内存;它可以选择分配一个新块,复制相关数据,并释放整个旧块。@sapi:True。标准引文清楚地说明了这一点。(用粗体标记)
void *realloc(void *ptr, size_t size);
// allocate memory for 10 integers
int *arr = malloc(10 * sizeof *arr);
// check arr for NULL in case malloc fails
// save the value of arr in temp in case
// realloc fails
int *temp = arr;
// realloc may keep the same block of memory
// and free the memory for the extra 5 elements
// or may allocate a new block for 5 elements,
// copy the first five elements from the older block to the
// newer block and then free the older block
arr = realloc(arr, 5 * sizeof *arr);
if(arr == NULL) {
// realloc failed
arr = temp;
}