开发者

How to free memory allocated using mmap?

开发者 https://www.devze.com 2023-03-26 09:01 出处:网络
I have allocated code using mmap, but unable to free it bec开发者_开发百科ause of segmentation fault. I have done mprotect - PROT_WRITE to make it writable, but still, I am unable to free it. My code:

I have allocated code using mmap, but unable to free it bec开发者_开发百科ause of segmentation fault. I have done mprotect - PROT_WRITE to make it writable, but still, I am unable to free it. My code:

 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 


You need to use munmap for that. You don't need to do anything else (change protection bits etc). But you should check the return code of munmap.

munmap(allocation, 5000);

free(3) can only be used to free memory allocated via malloc(3).

0

精彩评论

暂无评论...
验证码 换一张
取 消