首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 关于OpenLDAP查询以后的内存释放
【标  题】:关于OpenLDAP查询以后的内存释放
【关键字】:OpenLDAP
【来  源】:http://blog.csdn.net/shrekmu/archive/2006/11/14/1383104.aspx

关于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)会出错。
C++的学习3:【上一篇】
VC中DLL的创建及调用方法:【下一篇】
【相关文章】
  • openLDAP 初次尝试
  • OpenLDAP+FreeRADIUS+MySQL+RP-PPPOE 构建PPPOE服务器
  • Red Hat Enterprise Linux4.0下OpenLDAP 2.3.24的安装
  • OpenLDAP管理员指南
  • OpenLDAP Software 2.3 Administrator's Guide
  • OpenLDAP -- Unrecognized database type (bdb)
  • FreeBSD下利用ACI/SSL安全使用OpenLDAP
  • 用OpenLdap建立网络数据库
  • OpenLDAP快速上手
  • M-HowTo-安装LAPD服务器OPENLDAP
  • 【随机文章】
  • 网络最经典命令行 安全工作者的必杀技
  • Visual Basic创建“五星”级控件
  • IDS的弱点和局限(1)
  • FVWM的一些中文解释
  • 欢迎大家在此讨论有关linux的话题。
  • What is TinyOS?
  • 一款威力强大的注射工具(Domain3.5)
  • 常用的140个Windows XP设置
  • 如何使程序的执行结果同时定向到屏幕和文件
  • PS与水的质感表现
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.