gpt4 book ai didi

c - 从 mremap 段错误中释放内存

转载 作者:太空宇宙 更新时间:2023-11-04 07:58:18 24 4
gpt4 key购买 nike

释放通过 mremap(2) 更改的内存的规则是什么?实验表明,如果传递给 mremap() 的地址与返回的地址相同,则 free() 将起作用。但如果返回的地址不同,free() 将产生一个段错误。例如,

#include <stdio.h>
#include <stdlib.h>

#include <malloc.h>

#define __USE_GNU
#include <sys/mman.h>

#define ALLOC_SIZE (1024 * 1024)

int
main(int argc, char *argv[])
{
void *m = NULL, *tmp;
size_t size = 4 * ALLOC_SIZE;

m = memalign(4096, size);
if (m == NULL)
return EXIT_FAILURE;

tmp = mremap(m, size, size + ALLOC_SIZE, MREMAP_MAYMOVE);

if (tmp == MAP_FAILED) {
printf("mremap(%p, %zu, %zu, MREMAP_MAYMOVE) failed\n",
m, size, size+ALLOC_SIZE);
} else {
if (tmp != m) {
printf("Memory moved from %p to %p\n", m, tmp);
m = tmp;
}

size += ALLOC_SIZE;
}

printf("Freeing %zu bytes from %p\n", size, m);
free(m);

return EXIT_SUCCESS;
}

将出现段错误,除非

  • MREMAP_MAYMOVE 已删除
  • free 改为 munmap

如果答案是不使用 memalign 系列函数,而是使用 mmap 匿名内存,您能否指出说明是这种情况的手册页或类似内容?

最佳答案

免费的手册页(man 3 free):

The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc(), or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs.

基本上,在不是由 malloc 系列分配的内存上使用 free 是未定义的。由于您使用 mremap 作为分配内存的最后一个函数,因此它不是 malloc 分配的内存。

你必须在 mremap 之后在这里使用 munmap。此外,您不应该将 malloc 系列与 mmap 系列混合使用。那只是灾难的根源。

关于c - 从 mremap 段错误中释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48469985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com