valgrind 报告 ecpg内存泄露 (四)

简介:
我运行测试后的结论是这样的:确实发生了内存泄漏。没有回收sqlca区域。

因为,我修改了 /src/interfaces/ecpg/ecpglib/misc.c的代码后,

复制代码
#ifdef ENABLE_THREAD_SAFETY
static void
ecpg_sqlca_key_destructor(void *arg)
{
        FILE *p1;
        p1=fopen("gaoecpg.1","w+");
        fclose(p1);

        free(arg); /* sqlca structure allocated in ECPGget_sqlca */

        FILE *p2;
        p2=fopen("gaoecpg.2","w+");
        fclose(p2);         
        
}

static void
ecpg_sqlca_key_init(void)
{
        FILE *p3;
        p3=fopen("gaoecpg.3","w+");
        fclose(p3);
       
       pthread_key_create(&sqlca_key, ecpg_sqlca_key_destructor);

        FILE *p6;
        p6=fopen("gaoecpg.6","w+");
        fclose(p6);
}
#endif

struct sqlca_t *
ECPGget_sqlca(void)
{
#ifdef ENABLE_THREAD_SAFETY

        FILE *p4;
        p4=fopen("gaoecpg.4","w+");
        fclose(p4);

                struct sqlca_t *sqlca;

                pthread_once(&sqlca_key_once, ecpg_sqlca_key_init);

                sqlca = pthread_getspecific(sqlca_key);
                if (sqlca == NULL)
                {
                                sqlca = malloc(sizeof(struct sqlca_t));
                                ecpg_init_sqlca(sqlca);
                                pthread_setspecific(sqlca_key, sqlca);
                }
                return (sqlca);
#else
        FILE *p5;
        p5=fopen("gaoecpg.5","w+");
        fclose(p5);

              return (&sqlca);
#endif
}
复制代码
无论连接是成功还是失败,都生成三个文件:

gaoecpg.3,gaoecpg.4, gaoecpg.6

下面是我的测试程序 :

复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cm_connectdb(const char *DbUid,const char *DbPswd,const char *Hostname,char *pcSqlErrm)   
{
  EXEC SQL BEGIN DECLARE SECTION;
        varchar  sUserid[20];
        varchar  sPasswd[20];
        varchar  sHostname[64];
  EXEC SQL END DECLARE SECTION;

  memset(sUserid.arr, '\0',sizeof(sUserid.arr));
  memset(sPasswd.arr, '\0',sizeof(sPasswd.arr));
  memset(sHostname.arr, '\0',sizeof(sHostname.arr));
  if (DbUid == NULL || DbPswd == NULL || 
           Hostname == NULL || pcSqlErrm == NULL){
       return -1;
  }

  strcpy((char *)sUserid.arr, DbUid);
  sUserid.len = (unsigned short)strlen((char *)sUserid.arr);

  strcpy((char *)sPasswd.arr, DbPswd);
  sPasswd.len = (unsigned short)strlen((char *)sPasswd.arr);

  strcpy((char *)sHostname.arr, Hostname);
  sHostname.len = (unsigned short)strlen((char *)sHostname.arr);
  EXEC SQL CONNECT TO :sHostname AS CM_DBCONN USER:sUserid IDENTIFIED BY :sPasswd;

  if (sqlca.sqlcode!=0){
    fprintf(stderr,"Connection Failed.\n");
    EXEC SQL DISCONNECT CM_DBCONN;
    return -1;
  }else{
    fprintf(stderr,"Connection Succeeded!\n");
  }

  EXEC SQL DISCONNECT CM_DBCONN;
  return 0;
}

int main(){
  int ist=0;
  char * perr;
  perr = (char *) malloc (sizeof(char)*64);
  const char * pusr="postgres";
  const char * ppass="postgres";
  const char * phost="postgres@localhost:5432";
  ist= cm_connectdb(pusr,ppass,phost,perr);
  free(perr);
  return 0;
}
复制代码
虽然,按照网上的说法,理论上:线程结束的时候,就会自动调用pthread_key_create注册的函数

但是至少我遇到的情况,并非如此。



本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/08/22/2650781.html,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
人工智能 监控 机器人
【Valgrind】如何使用Valgrind监控内存
【Valgrind】如何使用Valgrind监控内存
|
11月前
|
存储 XML NoSQL
提高代码质量,避免内存泄漏:深入探索Valgrind工具
提高代码质量,避免内存泄漏:深入探索Valgrind工具
|
5月前
|
IDE Linux 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(一)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
1243 0
|
5月前
|
缓存 测试技术 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(二)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
146 0
|
5月前
|
XML NoSQL Linux
内存泄漏专题(3)内存泄漏调试神器valgrind
内存泄漏专题(3)内存泄漏调试神器valgrind
72 0
|
5月前
|
XML 存储 NoSQL
内存泄漏检测工具valgrind神器
内存泄漏检测工具valgrind神器
124 0
|
存储 Prometheus Kubernetes
一次Dockerd内存泄露分析
董江,容器技术布道者及实践者,中国移动高级系统架构专家,曾担任华为云核心网技术专家,CloudNative社区核心成员,KubeServiceStack社区发起者,Prometheus社区PMC,Knative Committer,Grafana社区Contributer。 欢迎关注:https://kubeservice.cn/
一次Dockerd内存泄露分析
|
XML 存储 缓存
内存泄漏检测神器valgrind
Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。
677 0
|
分布式计算 Hadoop Linux
C/C++的内存泄漏检测工具Valgrind memcheck的使用经历
Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Linux下用g++编译运行却崩溃了,给出一堆汇编代码也看不懂。
1478 0
基于WinDbg的内存泄漏分析
在前面C++中基于Crt的内存泄漏检测一文中提到的方法已经可以解决我们的大部分内存泄露问题了,但是该方法是有前提的,那就是一定要有源代码,而且还只能是Debug版本调试模式下。实际上很多时候我们的程序会用到第三方没有源代码的模块,有些情况下我们甚至怀疑系统模块有内存泄露,但是有没有证据,我们该怎么办? 这时我们就要依靠无所不能的WinDbg了。
1147 0