OCCI中的内存泄漏 Memory Leak in OCCI

OCCI与Valgrind内存泄漏误报
本文介绍了一个使用Oracle Call Interface (OCCI)的小程序,在使用Valgrind进行内存泄漏检测时遇到的问题及解决办法。文章指出,部分错误并非程序自身造成,而是由OCCI库本身的实现方式导致。

一个简单的OCCI小程序充,用valgrind 检查也会报一大堆错误
valgrind --tool=memcheck --leak-check=yes ./occiexam

据oralce forum上的一位kyrptt老兄说, 这并不是程序的问题,而是OCCI库本身的问题

"You do not have a Leak.

The OCCI library allocates space for something in setUserName with:

new[] and then de-allocates it with delete instead of delete[].

Actually the OCCI library outputs alot of messages with Valgrind. but I have not noticed nay particularly damaging leaks.

I suggest you use a Suppresions file to ignore the specific OCCI related errors so you dont miss leaks of your own."

害得我花了这么长时间去研究这个问题,

 

#include  < iostream >
#include 
< string >
#include 
< vector >

#include 
< occi.h >

using   namespace  std;
using   namespace  oracle::occi;


int  main()
{

Environment
* env;
env 
= Environment::createEnvironment(Environment::OBJECT);
cout 
<< "Enviorment created " << endl;

Connection
* conn;
Statement 
*stmt;
ResultSet 
*rs;
vector
<MetaData> vMD;
vector
<MetaData> vArgMD;
int dataType;
char tmpChar[1024];

Statement::Status status;
try
{

conn 
= env->createConnection("iris","tpstps""iris10gr1");
cout 
<< "connection created " << endl;
stmt 
= conn->createStatement();

string sStmt = "begin :1 := PKGNETWORK.spGetNetworkInfoByIP(:2, :3); end;";
// 1st sp 
stmt->setSQL(sStmt);
stmt
->registerOutParam(1, OCCIINT); 
stmt
->setString(2,"192.168.6.12");
stmt
->setMaxParamSize(2,20);
stmt
->registerOutParam(3,OCCICURSOR);

status 
= stmt->execute();
int retVal = stmt->getInt(1);
rs 
= stmt->getCursor(3);//use ResultSet to fetch rows
vMD = rs->getColumnListMetaData();
dataType 
= vMD[0].getInt(MetaData::ATTR_DATA_TYPE);

cout 
<< "Attribute count : " << vMD[0].getAttributeCount() << endl;
dataType
=vMD[0].getInt(MetaData::ATTR_DATA_TYPE);
cout 
<< "Attribute type : " << dataType << endl;
cout 
<< "Attribute name : " << vMD[0].getString(MetaData::ATTR_NAME)<< endl;
cout 
<< "Size : " << vMD.size() << endl;
while (rs->next())
{
cout 
<< "next row";
cout 
<< "NetID : " << rs->getString(1).c_str() << endl;
}
 

cout 
<< " vector filled for SP1" << endl;
cin 
>> tmpChar;

vMD.clear();
stmt
->closeResultSet(rs);
conn
->terminateStatement(stmt);

cout 
<< "1st sp executed" << endl;

// 2nd sp 
string sStmt1 = "begin :1 := PKGJUNK.SpGetTblAccount(:2); end;";
stmt 
= conn->createStatement();
stmt
->setSQL(sStmt1);
stmt
->registerOutParam(1, OCCIINT); 
stmt
->registerOutParam(2,OCCICURSOR);
status 
= stmt->execute();

retVal 
= stmt->getInt(1);
rs 
= stmt->getCursor(2);//use ResultSet to fetch rows
int loop = 1;
vMD 
= rs->getColumnListMetaData();
dataType 
= vMD[0].getInt(MetaData::ATTR_DATA_TYPE);

cout 
<< "Attribute count : " << vMD[0].getAttributeCount() << endl;
dataType
=vMD[0].getInt(MetaData::ATTR_DATA_TYPE);
cout 
<< "Attribute type : " << dataType << endl;
cout 
<< "Attribute name : " << vMD[0].getString(MetaData::ATTR_NAME)<< endl;
cout 
<< "Size : " << vMD.size() << endl;
while (rs->next())
{
cout 
<< "next row";
cout 
<< "NetID : " << rs->getString(1).c_str() << endl;
}
 

stmt
->closeResultSet(rs);
cout 
<< "2nd sp executed" << endl;

conn
->terminateStatement(stmt);

// sp-3 
string sStmt2 = "begin :1 := PKGONELINK.spValidateAccount(:2,:3,:4,:5,:6); end;";
stmt 
= conn->createStatement();
stmt
->setSQL(sStmt2);
stmt
->registerOutParam(1, OCCIINT); 
stmt
->setString(2,"37863 ");
stmt
->setMaxParamSize(2,100);
stmt
->registerOutParam(3,OCCISTRING, 20);
stmt
->registerOutParam(4,OCCISTRING, 2);
stmt
->registerOutParam(5,OCCISTRING, 3);
stmt
->registerOutParam(6,OCCISTRING, 3);

status 
= stmt->execute();

cout 
<< "3rd sp executed" << endl;

conn
->terminateStatement(stmt);
conn
->flushCache();
env
->terminateConnection(conn);

vMD.clear();

cout 
<< "Demo completed...data deleted" << endl;
cin 
>> tmpChar;
}

catch (SQLException &ex)
{//cleanup
cout << "Error, cleaning up..." << ex.getMessage() << endl;
conn
->terminateStatement(stmt);
env
->terminateConnection(conn);
cout 
<< "terminating env" << endl;
Environment::terminateEnvironment(env);
// throw;//will be caught by outer handler
}


Environment::terminateEnvironment(env);

return 0;
}


 

Reference
http://forums.oracle.com/forums/thread.jspa?messageID=1493167

 
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值