[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