【问题标题】:How to free memory allocated using mmap?如何释放使用 mmap 分配的内存?
【发布时间】:2011-10-22 05:37:37
【问题描述】:

我已使用mmap 分配代码,但由于分段错误而无法释放它。我已经完成了mprotect - PROT_WRITE 使其可写,但我仍然无法释放它。我的代码:

 1 #include <stdio.h>
 2 #include <memory.h>
 3 #include <stdlib.h>
 4 #include <unistd.h>
 5 #include <sys/mman.h>
 6 #include <sys/types.h>
 7 #include <fcntl.h>
 8 
 9 int main()
10 {
11  void * allocation;
12  size_t size;
13  static int devZerofd = -1;
14 
15  if ( devZerofd == -1 ) {
16                 devZerofd = open("/dev/zero", O_RDWR);
17                 if ( devZerofd < 0 )
18                         perror("open() on /dev/zero failed");
19 }
20 
21  allocation = (caddr_t) mmap(0, 5000, PROT_READ|PROT_NONE, MAP_PRIVATE, devZerofd,  0);
22 
23  if ( allocation == (caddr_t)-1 )
24                 fprintf(stderr, "mmap() failed ");
25 
26  if ( mprotect((caddr_t)allocation, 5000, PROT_WRITE) < 0 )
27         fprintf(stderr, "mprotect failed");
28  else
29         printf("mprotect done: memory allocated at address %u\n",allocation);
30 
31  strcpy(allocation,"Hello, how are you");
32  puts(allocation);
33 
34  if ( mprotect((caddr_t)allocation, 5000, PROT_WRITE) < 0 )
35         fprintf(stderr, "mprotect failed");
36 
37  free(allocation);
38 
39 }
40 
41 

【问题讨论】:

  • 使用 munmap 函数,其语法为“int munmap(void *addr, size_t len);”
  • 谢谢,是的,我已经用过了,它正在工作:)

标签: c linux memory


【解决方案1】:

您需要为此使用munmap。您不需要做任何其他事情(更改保护位等)。但是你应该检查munmap的返回码。

munmap(allocation, 5000);

free(3) 只能用于释放通过malloc(3) 分配的内存。

【讨论】:

  • 如果我使用 munmap,最后两行,mprotect - PROT_WRITE 也不需要,对吧?我的意思是 munmap 可以在受保护的内存上完成吗?
  • 能否告诉我是否可以使用free 来释放mmap 分配的内存。
  • @Bionix1441 一般来说,没有。对于使用mallocrealloc 分配的内存,调用free 是安全的。
猜你喜欢
  • 1970-01-01
  • 2020-07-12
  • 2011-10-24
  • 2011-06-14
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多