关于OpenLDAP查询以后的内存释放

示例代码:
    // データベースにエントリーを検索する
    result = ldap_search_ext_s(ld, base.c_str(), LDAP_SCOPE_SUBTREE, str_filter.c_str(), attrs, 0,
                               NULL, NULL, TIME_OUT, sizeLimite, &msg);
                              
    // 変数をクリアする
    delete[] attrs;
   
    if (result != LDAP_SUCCESS)
    {
        // 検索が失敗した場合、CISNSException異常をスローする
        DEBUG_1(g_debug_flag, ldap_search_ext_s():failed[%s], ldap_err2string(result));
       
        // 検索対象が存在しない場合、エラーとしない
        if (result != LDAP_NO_SUCH_OBJECT)
        {
            // 検索が失敗した場合、エラーコードをリターンする
            throw CISNSException(LOG_ALERT, LOG_ALERT_DB_DELETE_FAIL);
        }
    }
   
    // 検索した結果のカウントを取得する
    resultCount = ldap_count_entries(ld, msg);
    DEBUG_1(g_debug_flag, The number of entries returned was %d, resultCount);
    if (resultCount == 0)
    {
        // 検索した結果がない場合、リターンする
        return;
    }
       
    // 検索したエントリーを取得する
    for(entry = ldap_first_entry(ld, msg); entry != NULL; entry = ldap_next_entry(ld, entry))
    {
        // 取得したエントリーのDNを取得する
        if ((dn = ldap_get_dn(ld, entry)) != NULL)
        {
            //DEBUG_1(g_debug_flag, Returned dn: %s, dn);
            ldap_memfree(dn);
        }
       
        // 取得したエントリーの属性を取得する
        for( attr = ldap_first_attribute(ld, entry, &ber);
             attr != NULL;
             attr = ldap_next_attribute(ld, entry, ber))
        {
            // 検索した属性値を格納する変数
            berval** bvals;
            if ((bvals = ldap_get_values_len(ld, entry, attr)) != NULL)
            {
                // 取得したエントリー属性値を別に取得する
                for(i = 0; bvals[i] != NULL; i++)
                {
                    // 検索した属性値を戻り属性に設定する
                    DEBUG_2(g_debug_flag, %s: %s, attr, bvals[i]->bv_val);
                }
               
                // 検索した属性値を格納する変数をクリアする
                ldap_value_free_len(bvals);
            }
           
            // クラム名をクリアする
            ldap_memfree(attr);
        }

        // BerElementをクリアする
        if (ber != NULL)
        {
            ber_free(ber, 0);
        }
    }
   
    // LDAPMessageをクリアする
    ldap_msgfree(msg);
    ldap_msgfree(entry);

最后一句在执行的时候偶尔会出错,查看了OpenLDAP的源代码后发现msg是以一种链表的结构存储的,所以就有:

LDAPMessage *
ldap_first_message( LDAP *ld, LDAPMessage *chain )
{
    assert( ld != NULL );
    assert( LDAP_VALID( ld ) );
    assert( chain != NULL );

      return chain;
}

LDAPMessage *
ldap_next_message( LDAP *ld, LDAPMessage *msg )
{
    assert( ld != NULL );
    assert( LDAP_VALID( ld ) );
    assert( msg != NULL );

    return msg->lm_chain;
}


int
ldap_msgfree( LDAPMessage *lm )
{
    LDAPMessage    *next;
    int        type = 0;

    Debug( LDAP_DEBUG_TRACE, "ldap_msgfree/n", 0, 0, 0 );

    for ( ; lm != NULL; lm = next ) {
        next = lm->lm_chain;
        type = lm->lm_msgtype;
        ber_free( lm->lm_ber, 1 );
        LDAP_FREE( (char *) lm );
    }

    return( type );
}
在作 ldap_msgfree(msg)时,已经将链表中的所有成员释放,所以难怪 ldap_msgfree(entry)会出错。

你可能感兴趣的:(String,object,ext,null,delete,search)