inet_ntoa导致内存泄露

本文介绍VxWorks环境下inet_ntoa函数存在的内存泄漏问题,并提供了一种解决方案,通过使用局部变量替代动态分配内存的方式避免了内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:

     cpu: ARM7

     OS:vxworks

     语言:C语言

   vxworks中inet_ntoa的实现代码如下

  char *inet_ntoa ( struct in_addr inetAddress   /* inet address */  )
  {

          FAST char *buf = (char *) malloc (INET_ADDR_LEN);
          if (buf != NULL)
             inet_ntoa_b (inetAddress, buf);
          return (buf);
  }
   malloc之后的内存是没有释放的。如果频繁的调用该函数就会使系统内存耗尽。

  测试方法: 手动起一个任务,在任务主循环中调用inet_ntoa,过一段时间就memShow一下。能明显的看到剩余内存在减少。

  改动方法:使用局部变量,传参给inet_ntoa_b来实现。


完善代码以及注释 #include "common.h" void *worker_pthread(void *arg){ int client_fd = *(int *)arg; char buffer[BUFFER_SIZE]; ssize_t bytes_read = read(client_fd,buffer,BUFFER_SIZE-1); if(bytes_read < 0) { close(client_fd); exit(EXIT_SUCCESS); } buffer[bytes_read] = '\0'; fprintf(stdout,"======buffer======\nclient_fd:%d\n%s============\n",buffer,client_fd); // 处理请求 handle_request(client_fd, buffer); // 关闭连接 close(client_fd); } int main() { int server_fd; struct sockaddr_in addr, client_addr; socklen_t addrlen = sizeof(addr); socklen_t client_len = sizeof(client_addr); pthread_t t_id; pthread_mutex_t mutex; pthread_mutex_init(&mutex,NULL); // if((server_fd = socket(AF_INET,SOCK_STREAM,0)) < 0 ) { } // int opt = 1; setsockopt(server_fd, SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); // memset(&addr,0,addrlen); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(PORT); // if(bind(server_fd,(struct sockaddr *)&addr,addrlen) < 0) { } // if(listen(server_fd,SOMAXCONN) < 0) { } while (1) { int client_fd = accept(server_fd,(struct socketaddr *)&client_addr,&client_len); if (client_fd < 0) { if (errno == EINTR) continue; // 被信号中断,重试 perror("accept"); continue; } printf("[pthread %d] New connection: %s:%d\n", t_id,inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port)); pthread_create(&t_id,NULL,worker_pthread,&client_fd); // pthread_detach(t_id); pthread_join(t_id,NULL); } close(server_fd); // pthread_mutex_destroy(&mutex); return 0; }
最新发布
08-12
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值