免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3966 | 回复: 2

在C语言中使用ct_library访问sybase数据库,存在内存泄露 [复制链接]

论坛徽章:
0
发表于 2009-09-14 10:38 |显示全部楼层
5可用积分
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctpublic.h>

CS_CONTEXT     *context;  /* 内容结构 */
CS_CONNECTION  *ptrconnection; /* 连接结构 */

void    DisConnectSybaseDB();         //断开数据库
void    ShowDBError(int  nErrCode);   //显示连接数据库时的错误信息


bool ConnectSybaseDB(char* strDBName,char* strUser,char* strPassword)
{
    CS_RETCODE ret;
    char username[32],password[32];
    memset(username,0,sizeof(username));
    memset(password,0,sizeof(password));
    strcpy(username,strUser);
    strcpy(password,strPassword);
    /*分配内容结构*/
    if((ret=cs_ctx_alloc(CS_VERSION_100, &context)) != CS_SUCCEED)
    {
        //不成功则调用ShowDBError显示错误代码
        ShowDBError(ret);
        return false;
    }
    /*初始化Client_Library*/
    if((ret=ct_init(context,CS_VERSION_100)) != CS_SUCCEED)
    {
        ShowDBError(ret);
        return false;
    }
    /*分配连接结构*/
    if((ret=ct_con_alloc(context, &ptrconnection))!=CS_SUCCEED)
    {
        ShowDBError(ret);
        return false;
    }
    /*设置用户名和口令*/
    if((ret=ct_con_props(ptrconnection,CS_SET,CS_USERNAME,username,CS_NULLTERM,NULL))!=CS_SUCCEED)
    {
        ShowDBError(ret);
        return false;
    }
    if((ret=ct_con_props(ptrconnection,CS_SET,CS_PASSWORD,password,CS_NULLTERM,NULL))!=CS_SUCCEED)
    {
        ShowDBError(ret);
        return false;
    }
    /*建立连接*/
    char instance[20];
    strcpy(instance,strDBName);
    if((ret=ct_connect(ptrconnection, (CS_CHAR *)instance, sizeof(instance))) != CS_SUCCEED)
    {
        ShowDBError(ret);
        return false;
    }
    else
        return true;
}
//////////////**********断开连接函数***********//////////////
void DisConnectSybaseDB()
{
    CS_RETCODE ret;
    if ((ret = ct_close(ptrconnection, CS_UNUSED))!= CS_SUCCEED)
    {
        ShowDBError(ret);
    }
    if ((ret = ct_con_drop(ptrconnection)) != CS_SUCCEED)/*释放资源*/
    {
        ShowDBError(ret);
    }
    if((ret=ct_exit(context,CS_UNUSED))!=CS_SUCCEED)     /*关闭与服务器的所有连接,退出CT-L*/
    {
        ShowDBError(ret);
    }
    if((ret=cs_ctx_drop(context))!=CS_SUCCEED)           /*释放环境结构占用的资源*/
    {
        ShowDBError(ret);
    }
    context = (CS_CONTEXT *)NULL;
    return;
}
//////////////**********显示错误代码函数***********//////////////
void ShowDBError(int  nErrCode)
{
    char strDBErrorInfo[1024];
    memset(strDBErrorInfo, 0, 1024);
    switch(nErrCode)
    {
        case CS_MEM_ERROR:
            strcpy(strDBErrorInfo, "内存不足或地址分配错误!");
            break;
        case CS_PENDING:
            strcpy(strDBErrorInfo, "异步网络I/O正在进行!");
            break;
        case CS_BUSY:
            strcpy(strDBErrorInfo, "当前连接内有一异步操作正在进行!");
            break;
        case CS_CANCELED:
            strcpy(strDBErrorInfo, "操作被取消!");
            break;
        case CS_END_RESULTS:
            strcpy(strDBErrorInfo, "从服务器返回的结果处理结束!");
            break;
        case CS_ROW_FAIL:
            strcpy(strDBErrorInfo, "提取当前行的数据失败!");
            break;
        case CS_END_DATA:
            strcpy(strDBErrorInfo, "数据提取结束!");
            break;
        case CS_FAIL:
            strcpy(strDBErrorInfo, "函数执行失败!");
            break;
        default:
            strcpy(strDBErrorInfo, "系统不识别的错误!");
            break;
    }
    printf(strDBErrorInfo);
}

void TestSybaseDB()
{
    if(ConnectSybaseDB("DB_SERVER", "user", "password"))
        printf("success\n");
    else
        printf("false\n");
    DisConnectSybaseDB();
}


int main(int argc, char** argv)
{
    TestSybaseDB();
    return 0;
}

这是我在网上找到的一段代码,能够成功连接数据库,但是使用valgrind检测,总是发现有内存泄露

==1615== searching for pointers to 71 not-freed blocks.
==1615== checked 21,213,316 bytes.
==1615==
==1615==
==1615== 28 bytes in 1 blocks are still reachable in loss record 1 of 6
==1615==    at 0x40053C0: malloc (vg_replace_malloc.c:149)
==1615==    by 0x80D9A8: _dl_map_object_deps (in /lib/ld-2.5.so)
==1615==    by 0x81288C: dl_open_worker (in /lib/ld-2.5.so)
==1615==    by 0x80EC35: _dl_catch_error (in /lib/ld-2.5.so)
==1615==    by 0x812211: _dl_open (in /lib/ld-2.5.so)
==1615==    by 0x9214E1: do_dlopen (in /lib/libc-2.5.so)
==1615==    by 0x80EC35: _dl_catch_error (in /lib/ld-2.5.so)
==1615==    by 0x921694: __libc_dlopen_mode (in /lib/libc-2.5.so)
==1615==    by 0x99CAD6: pthread_cancel_init (in /lib/libpthread-2.5.so)
==1615==    by 0x99CC00: _Unwind_ForcedUnwind (in /lib/libpthread-2.5.so)
==1615==    by 0x99A6D0: __pthread_unwind (in /lib/libpthread-2.5.so)
==1615==    by 0x99539F: pthread_exit (in /lib/libpthread-2.5.so)
==1615==
==1615==
==1615== 36 bytes in 1 blocks are still reachable in loss record 2 of 6
==1615==    at 0x40053C0: malloc (vg_replace_malloc.c:149)
==1615==    by 0x413D84E: comn_calloc (in /home/dhcp/sybase/OCS-12_5/lib/libintl_r.so)
==1615==    by 0x410E54B: comn_create_mutex (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x410F1BD: comn_signal_setup (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x41045D9: com_appglobal_alloc (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x4090E5D: cs_ctx_alloc (in /home/dhcp/sybase/OCS-12_5/lib/libcs_r.so)
==1615==    by 0x8048BFB: ConnectSybaseDB(char*, char*, char*) (test.cpp:40)
==1615==    by 0x8048DCB: TestSybaseDB() (test.cpp:143)
==1615==    by 0x8048E07: main (test.cpp:153)
==1615==
==1615==
==1615== 48 bytes in 1 blocks are still reachable in loss record 3 of 6
==1615==    at 0x40046FF: calloc (vg_replace_malloc.c:279)
==1615==    by 0x998A13: pthread_cond_broadcast@GLIBC_2.0 (in /lib/libpthread-2.5.so)
==1615==    by 0x410E864: comn_signal_event (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x410F95D: comn__sig_catcher_thread (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x99443A: start_thread (in /lib/libpthread-2.5.so)
==1615==    by 0x8EBFDD: clone (in /lib/libc-2.5.so)
==1615==
==1615==
==1615== 240 bytes in 2 blocks are still reachable in loss record 4 of 6
==1615==    at 0x40053C0: malloc (vg_replace_malloc.c:149)
==1615==    by 0x400544A: realloc (vg_replace_malloc.c:306)
==1615==    by 0x413D8C6: comn_realloc (in /home/dhcp/sybase/OCS-12_5/lib/libintl_r.so)
==1615==    by 0x40BCE46: sybnet__async_poll (in /home/dhcp/sybase/OCS-12_5/lib/libsybtcl_r.so)
==1615==    by 0x99443A: start_thread (in /lib/libpthread-2.5.so)
==1615==    by 0x8EBFDD: clone (in /lib/libc-2.5.so)
==1615==
==1615==
==1615== 288 bytes in 2 blocks are possibly lost in loss record 5 of 6
==1615==    at 0x40046FF: calloc (vg_replace_malloc.c:279)
==1615==    by 0x811AC9: _dl_allocate_tls (in /lib/ld-2.5.so)
==1615==    by 0x994B28: pthread_create@@GLIBC_2.1 (in /lib/libpthread-2.5.so)
==1615==    by 0x9951A7: pthread_create@GLIBC_2.0 (in /lib/libpthread-2.5.so)
==1615==    by 0x410E3DD: comn_create_thread_ex (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x410EC8F: comn_create_thread (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x410F278: comn_signal_setup (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x41045D9: com_appglobal_alloc (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x4090E5D: cs_ctx_alloc (in /home/dhcp/sybase/OCS-12_5/lib/libcs_r.so)
==1615==    by 0x8048BFB: ConnectSybaseDB(char*, char*, char*) (test.cpp:40)
==1615==    by 0x8048DCB: TestSybaseDB() (test.cpp:143)
==1615==    by 0x8048E07: main (test.cpp:153)
==1615==
==1615==
==1615== 11,649 bytes in 64 blocks are still reachable in loss record 6 of 6
==1615==    at 0x40053C0: malloc (vg_replace_malloc.c:149)
==1615==    by 0x413D883: comn_malloc (in /home/dhcp/sybase/OCS-12_5/lib/libintl_r.so)
==1615==    by 0x410E7C8: comn_create_event (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x410F252: comn_signal_setup (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x41045D9: com_appglobal_alloc (in /home/dhcp/sybase/OCS-12_5/lib/libcomn_r.so)
==1615==    by 0x4090E5D: cs_ctx_alloc (in /home/dhcp/sybase/OCS-12_5/lib/libcs_r.so)
==1615==    by 0x8048BFB: ConnectSybaseDB(char*, char*, char*) (test.cpp:40)
==1615==    by 0x8048DCB: TestSybaseDB() (test.cpp:143)
==1615==    by 0x8048E07: main (test.cpp:153)

论坛徽章:
0
发表于 2009-09-14 10:49 |显示全部楼层
请大家看看是不是程序的流程存在问题啊?释放的时候怎样才能释放干净呢?

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2009-09-14 12:27 |显示全部楼层
感觉流程应该没有什么问题吧,
无论在什么位置退出,保证调用DisConnectSybaseDB断连接并释放资源应该就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP