原帖
http://bbs.chinaunix.net/viewthread.php?tid=865766&extra=page%3D4環境說明:
OS : Debian Linux testing
Oracle :Oracle 10.2.0.1.0
dmalloc :5.4.2-5   疑問一.
以下代碼OCIEnvCreate, OCIHandleFree是否使用正確 ?
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <dmalloc.h>
#include "oci.h"int  main(int argc, char *argv[])
{
        OCIEnv       *envhp;
        if (OCIEnvCreate ( &envhp, (ub4)OCI_DEFAULT, (dvoid *)0,
                        (dvoid * (*)(dvoid *, size_t)) 0,
                        (dvoid * (*)(dvoid *, dvoid *, size_t)) 0,
                        (void (*)(dvoid *, dvoid *)) 0,
                        (size_t) 0,
                        (dvoid **) 0))  {
                printf("couldn't create environment");
        }        OCIHandleFree ((dvoid *)envhp, OCI_HTYPE_ENV);        exit(0) ;
}
疑問二:
編譯:
   $gcc -I /app/oracle/product/10.2.0.1/rdbms/public/ -L /app/oracle/product/10.2.0.1/lib/ -o aa aa.c -ldmalloc -lclntsh$dmalloc -l aa.log all
$DMALLOC_OPTIONS=debug=0xcf66d2b,log=aa.log
$export DMALLOC_OPTIONS
執行後得到aa.log檔. 發現很多沒有釋放的指針 (附檔aa.log.gz)
請幫忙分析一下1165293967: 312: top 10 allocations:
1165293967: 312:  total-size  count in-use-size  count  source
1165293967: 312:      408211      3      384987      1  ra=0xb7682d8c
1165293967: 312:      145150     18      145150     18  ra=0xb7c0b866
1165293967: 312:      129404      5      129404      5  ra=0xb7b9e11d
1165293967: 312:        5200      5        5200      5  ra=0xb7bf4ee2
1165293967: 312:        4092     31        3564     27  ra=0xb7bf169e
1165293967: 312:        3468      1        3468      1  ra=0xb7c735db
1165293967: 312:        2080      2        2080      2  ra=0xb7bf5a6e
1165293967: 312:        1408      4           0      0  ra=0xb705da1f
1165293967: 312:        1224      3         408      1  ra=0xb7c6b2ba
1165293967: 312:      706400    214      678731    117  Total of 50
1165293967: 312: Dumping Not-Freed Pointers Changed Since Start:
1165293967: 312:  not freed: '0xb6c92008|s1' (103328 bytes) from 'ra=0xb7b9e11d'
1165293967: 312:  not freed: '0xb6cac808|s1' (860 bytes) from 'ra=0xb7b9e11d'
1165293967: 312:  not freed: '0xb6cacc08|s1' (792 bytes) from 'ra=0xb7b9e11d'
1165293967: 312:  not freed: '0xb6cb4008|s1' (2216 bytes) from 'ra=0xb7b9e11d'
1165293967: 312:  not freed: '0xb6cb5008|s1' (22208 bytes) from 'ra=0xb7b9e11d'

解决方案 »

  1.   

    不要用OCI了:( OCCI也不要用了:(,oracle不知道怎么想的,这两个都有内存泄漏的,改吧,改成jdbc的就行了。
      

  2.   

    不是说你的这个程序的,我说的是多线程下的,呵呵,如果用多线程就不要用OCI和OCCI,这个的没仔细看。所以感觉除了要玩玩,就不要用OCI和OCCI了。
      

  3.   

    是OCI多線程有內存洩露?
    我的這段測試代碼是單線程的.不用OCI又用什麼呢?
    程序又不是java寫的.郁悶