[AGENT++] Hi, all, why these code lead to memry leak?
cheng wan
wancheng82 at gmail.com
Mon Mar 1 08:39:58 CET 2010
It seems clear&add_row frequently will cause memory leak.
Any suggestion will be approved.
Thank you all.
2010/3/1 cheng wan <wancheng82 at gmail.com>:
> The code below is main for:
> 1)Get tcp info from /proc/net/tcp.
> 2)tcp_conn_table_index() is to compute the index of tcpConnEntry.
> Indexes: 1: tcpConnLocalAddress
> 2: tcpConnLocalPort
> 3: tcpConnRemAddress
> 4: tcpConnRemPort
> 3)Before add one row to tcpConnEntry::instance, I use
> tcpConnEntry::instance->clear() to clear all the rows
> 4)get_proc_net_tcp() is excuted by one 2 seconds timer
> The memory keeps growning.
> Thank you all.
>
>
> uin32_t tcp_conn_local_address, tcp_conn_local_port, tcp_conn_rem_address,
> tcp_conn_rem_port, tcp_conn_state;
>
> void tcp_conn_table_index(struct in_addr local_address,
> uint32_t local_port,
> struct in_addr rem_address,
> uint32_t rem_port,
> char *buf) {
> char *local_address_ptr = inet_ntoa(local_address); // in_addr to char *
> IpAddress ip_address_one(local_address_ptr);
> char *rem_address_ptr = inet_ntoa(rem_address); // in_addr to char *
> IpAddress ip_address_two(rem_address_ptr);
> snprintf(buf, MAXLINE, "%d.%d.%d.%d.%d.%d.%d.%d.%d.%d",
> (unsigned char)ip_address_one[0],
> (unsigned char)ip_address_one[1],
> (unsigned char)ip_address_one[2],
> (unsigned char)ip_address_one[3],
> local_port,
> (unsigned char)ip_address_two[0],
> (unsigned char)ip_address_two[1],
> (unsigned char)ip_address_two[2],
> (unsigned char)ip_address_two[3],
> rem_port
> );
> }
>
> void get_proc_net_tcp()
> {
> FILE *in = NULL;
> in = fopen ("/proc/net/tcp", "r");
> char line [MAXLINE];
> int32_t num;
> static int map_states[] = { 1, 5, 3, 4, 7, 10, 11, 1, 6, 9, 2, 8 };
>
> if(!in) {
> XLOG_WARNING("unable to open /proc/net/tcp, %s\n", strerror(errno));
> return false;
> }
>
> tcpConnEntry::instance->clear();
>
> while (line == fgets(line, sizeof(line), in)) {
> sscanf(line, "%d: %x:%x %x:%x %x", &num,
> &tcp_conn_local_address,
> &tcp_conn_local_port,
> &tcp_conn_rem_address,
> &tcp_conn_rem_port,
> &tcp_conn_state);
> struct in_addr local_address, rem_address;
> memcpy(&local_address, &tcp_conn_local_address, sizeof(struct in_addr));
> memcpy(&rem_address, &tcp_conn_rem_address, sizeof(struct in_addr));
>
> string local_address_str = inet_ntoa(local_address);
> string rem_address_str = inet_ntoa(rem_address);
>
> char buf[MAXLINE];
> memset(buf, 0, sizeof(buf));
> tcp_conn_table_index(local_address, tcp_conn_local_port,
> rem_address, tcp_conn_rem_port, buf);
>
> MibTableRow* row = tcpConnEntry::instance->add_row(buf);
>
> if((tcp_conn_state >= 0) && (tcp_conn_state < 12)) {
> tcp_conn_state = map_states[tcp_conn_state];
> } else {
> tcp_conn_state = 1;
> }
>
> tcpConnEntry::instance->set_row(row,
> tcp_conn_state,
> local_address_str.c_str(),
> tcp_conn_local_port,
> rem_address_str.c_str(),
> tcp_conn_rem_port
> );
>
> }
> fclose(in);
> return true;
> }
>
More information about the AGENTPP
mailing list