Hi all
For past three days am trying to figure out the cause of error. I am using shared_array, allocating it memory equal to size of data am populating it with and then storing the data in the "shared_array". but when shared_ptr goes out of scope and is internally deallocated, error is thrown....
I am populating my shared_array type data with data fetched from database....
here's part of my code
*******************************************************************************************************************************************************************************
// ***********Main function***************
#include <stdio.h>
#include <occi.h>
#include <iostream>
#include <pthread.h>
#include "RtShDataDao.hpp" //My own class with function declarations including rtGetRepositoryData(RtRepositoryDataVo & r_repositoryData,const RtU32T id,const RtU32T aliasOrPublic, const RtC8T * p_serviceIndication)
//RtU32T is unsigned int of size 32 bytes, RtC8t is Signed Char
#include <string>
#include <exception>
using namespace std;
using namespace oracle::occi;
int main()
{
void get_RepositoryData();
get_RepositoryData();
}
void get_RepositoryData()
{
RtShDataDao shDataDaoObj;
RtU32T id = 8;
RtU32T aliasOrPublic = 1;
RtRepositoryDataVo repositoryData;// = new RtRepositoryDataVo(); // RtRepositoryDataVo is class containing variables m_seq and mp_data
repositoryData.m_seq = 0;
RtC8T serviceIndication[50] = "service indication 8";
printf("\nAddress in shared ptr is %p\n",repositoryData.mp_data.get());
try
{
shDataDaoObj.rtGetRepositoryData(repositoryData,id,aliasOrPublic,serviceIndication);
}
catch (RtExceptionUD &eud)
{
cout<<"Error---------------------"<<eud.errString<<endl;
}
catch (SQLException &se)
{
cout << " SQL Exception -----------------"<<se.what() <<endl;
}
catch (exception & e)
{
cout << " Exception ----------"<<e.what() ;
}
cout<<" Returned from RtGetRepositoryData "<<endl;
cout<<endl<<" sequence "<<repositoryData.m_seq <<endl;
cout<<"repositoryData.mp_data "<<(repositoryData.mp_data.get())<<endl;
}
//*************** RtShDataDao.cpp***********************
// this class contains definitions of functions
//RtSpChar is defined as typedef shared_array<RtU8T> RtSpChar; in RtShared_ptr.hpp
#include <occi.h>
#include "RtExceptionUD.hpp"
#include <iostream>
using namespace std;
using namespace oracle::occi;
extern StatelessConnectionPool *g_scp;
#include "RtShDataDao.hpp"
void RtShDataDao::rtGetRepositoryData(RtRepositoryDataVo & r_repositoryData,const RtU32T id,const RtU32T aliasOrPublic, const RtC8T * p_serviceIndication) throw (RtExceptionUD &, exception &,SQLException &)
{
if(p_serviceIndication == NULL)
{
throw RtExceptionUD(" p_serviceIndication initialized with NULL");
}
if( aliasOrPublic < 0 )
{
throw RtExceptionUD(" aliasOrPublic initialized with unexpected value ");
}
if( id <= 0 )
{
throw RtExceptionUD(" id initialized with unexpected value ");
}
Connection *l_conn = g_scp->getConnection();
Statement *l_stmt = l_conn->createStatement();
ResultSet * l_rs;
int l_countRow = 0;
ub2 rc = 0, rc1 = 0;
sb2 ind = 0, ind1 = 0;
switch (aliasOrPublic)
{
case 0:
{
Clob l_repData;
l_stmt->setSQL(GET_REPOSITORY_DATA_PUBLIC);
ub2 l_lenInt = sizeof(int);
l_stmt->setDataBuffer(1,(void *)&id,OCCIINT,l_lenInt,&l_lenInt);
ub2 l_lenString = strlen (p_serviceIndication)+1;
l_stmt->setDataBuffer(2,(dvoid *)p_serviceIndication,OCCI_SQLT_STR, l_lenString, &l_lenString);
l_rs = l_stmt->executeQuery();
l_rs->setDataBuffer(1,(void *)&r_repositoryData.m_seq,OCCIINT,l_lenInt,&l_lenInt, &ind, &rc);
ub2 l_lenClob;
l_repData.setEmpty(l_conn);
l_rs->setDataBuffer(2,&l_repData,OCCI_SQLT_CLOB, l_lenClob, &l_lenClob, &ind1, &rc1);
while (l_rs->next())
{
if(!ind1)
{
unsigned int l_offset = 1;
r_repositoryData.mp_data = RtSpChar (new RtU8T(l_repData.length()+1));
l_repData.read(l_repData.length(),(unsigned char*)(r_repositoryData.mp_data.get()),l_repData.length(),l_offset);
r_repositoryData.mp_data[l_repData.length()] = '\0';
printf("address of the mp_data %p /n",r_repositoryData.mp_data.get());
getchar();
}
++l_countRow;
}
break;
}
case 1:
{
Clob l_repData;
l_stmt->setSQL(GET_REPOSITORY_DATA_ALIAS);
ub2 l_lenInt = sizeof(int);
l_stmt->setDataBuffer(1,(void *)&id,OCCIINT,l_lenInt,&l_lenInt);
ub2 l_lenString = strlen (p_serviceIndication)+1;
l_stmt->setDataBuffer(2,(dvoid *)p_serviceIndication,OCCI_SQLT_STR, l_lenString, &l_lenString);
l_rs = l_stmt->executeQuery();
l_rs->setDataBuffer(1,(void *)&r_repositoryData.m_seq,OCCIINT,l_lenInt,&l_lenInt, &ind, &rc);
ub2 l_lenClob;
l_repData.setEmpty(l_conn);
l_rs->setDataBuffer(2,&l_repData,OCCI_SQLT_CLOB, l_lenClob, &l_lenClob, &ind1, &rc1);
while (l_rs->next())
{
if(!ind1)
{
unsigned int l_offset = 1;
r_repositoryData.mp_data = RtSpChar (new RtU8T(l_repData.length()+1));
l_repData.read(l_repData.length(),(unsigned char*)(r_repositoryData.mp_data.get()),l_repData.length(),l_offset);
r_repositoryData.mp_data[l_repData.length()] = '\0';
printf("address of the mp_data %p /n",r_repositoryData.mp_data.get());
getchar();
}
// unsigned int l_offset = 1;
// r_repositoryData.mp_data = RtSpChar(new RtU8T(l_repData.length()));
// l_repData.read(l_repData.length(),(unsigned char *)r_repositoryData.mp_data.get(),l_repData.length(),l_offset);
++l_countRow;
}
break;
}
}
l_stmt->closeResultSet(l_rs);
l_conn->terminateStatement(l_stmt);
g_scp->releaseConnection(l_conn);
if(l_countRow == 0)
throw RtExceptionUD("RtShDataDao::getRepositoryData::No data fetched ....");
}
// This class contains definitions for variable m_seq and mp_data
#ifndef _RTREPOSITORYDATAVO_H
#define _RTREPOSITORYDATAVO_H
#include "RtDataType.h"
#include "RtShared_ptr.hpp"
using namespace boost;
// This class is a value object that shall have the repository data corresponding to the public identity id or alias grp id.
class RtRepositoryDataVo {
public:
// It is identity used for a set of service related transparent data.
RtC8T mp_serviceInd[30];
// The seqn is the sequence number which is used in order to maintain a uniformity in data shared AS and HSS.
RtU32T m_seq;
// The data is the transparent data.
RtSpChar mp_data;
//shared_ptr<RtU8T> mp_data;
// ~RtRepositoryDataVo(){cout<<"Destruc Use count is "<<mp_data.use_count()<<endl;}
};
#endif //_RTREPOSITORYDATAVO_H
//this class contains definitions for RtC8t and RtU32T
#ifndef _RTDATATYPE_H
#define _RTDATATYPE_H
// unsigned char
typedef unsigned char RtU8T;
// unsigned short
typedef unsigned short RtC16T;
// unsigned int
typedef unsigned int RtU32T;
// unsigned long
typedef unsigned long RtU64T;
// signed char
typedef signed char RtS8T;
// signed short
typedef signed short RtS16T;
// signed int
typedef signed int RtS32T;
// signed long
typedef signed long RtS64T;
// char
typedef char RtC8T;
#endif //_DATATYPE_H
*******************************************************************************************************************************************************************************
and here's the error am getting
Address in shared ptr is (nil)
address of the mp_data 0x82fa708 /n Returned from RtGetRepositoryData
sequence 0
repositoryData.mp_data data clob to be populated with information
*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x082fa708 ***
======= Backtrace: =========
/lib/libc.so.6[0x431a2f7d]
/lib/libc.so.6(cfree+0x90)[0x431a65d0]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x43dacef1]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0x43dacf4d]
./a.out[0x8061193]
./a.out[0x80611a7]
./a.out[0x8061296]
./a.out[0x805774c]
./a.out[0x8057776]
./a.out[0x8057806]
./a.out[0x805781c]
./a.out[0x8054ad2]
./a.out[0x8057556]
/lib/libc.so.6(__libc_start_main+0xdc)[0x43152dec]
./a.out(__gxx_personality_v0+0x3bd)[0x804ce91]
======= Memory map: ========
00110000-00294000 r-xp 00000000 fd:00 13844169 /app/oracle/product/11.1.0/db/lib/libnnz11.so
00294000-002b9000 rwxp 00184000 fd:00 13844169 /app/oracle/product/11.1.0/db/lib/libnnz11.so
002b9000-002ba000 rwxp 002b9000 00:00 0
002ba000-002bb000 r-xp 00000000 fd:00 14018711 /usr/lib/libaio.so.1.0.1
002bb000-002bc000 rwxp 00000000 fd:00 14018711 /usr/lib/libaio.so.1.0.1
002bc000-002ed000 r-xp 00000000 fd:00 13835865 /app/oracle/product/11.1.0/db/lib/libskgxp11.so
002ed000-002ef000 rwxp 00031000 fd:00 13835865 /app/oracle/product/11.1.0/db/lib/libskgxp11.so
002ef000-002f0000 --xp 002ef000 00:00 0
002f0000-002ff000 rwxp 002f0000 00:00 0
0037b000-00384000 r-xp 00000000 fd:00 7071017 /lib/libnss_files-2.5.so
00384000-00385000 r-xp 00008000 fd:00 7071017 /lib/libnss_files-2.5.so
00385000-00386000 rwxp 00009000 fd:00 7071017 /lib/libnss_files-2.5.so
0048e000-00493000 r-xp 00000000 fd:00 13844145 /app/oracle/product/11.1.0/db/lib/libnque11.so
00493000-00494000 rwxp 00005000 fd:00 13844145 /app/oracle/product/11.1.0/db/lib/libnque11.so
00612000-00a77000 r-xp 00000000 fd:00 13819009 /app/oracle/product/11.1.0/db/lib/liborasdkbase.so.11.1
00a77000-00a94000 rwxp 00464000 fd:00 13819009 /app/oracle/product/11.1.0/db/lib/liborasdkbase.so.11.1
00a94000-00a97000 rwxp 00a94000 00:00 0
00b71000-00b72000 r-xp 00b71000 00:00 0 [vdso]
00b72000-02486000 r-xp 00000000 fd:00 13844118 /app/oracle/product/11.1.0/db/lib/libclntsh.so.11.1
02486000-02527000 rwxp 01913000 fd:00 13844118 /app/oracle/product/11.1.0/db/lib/libclntsh.so.11.1
02527000-0253f000 rwxp 02527000 00:00 0
0253f000-03aef000 r-xp 00000000 fd:00 13819013 /app/oracle/product/11.1.0/db/lib/liborasdk.so.11.1
03aef000-03b7d000 rwxp 015b0000 fd:00 13819013 /app/oracle/product/11.1.0/db/lib/liborasdk.so.11.1
03b7d000-03b92000 rwxp 03b7d000 00:00 0
08048000-08114000 r-xp 00000000 fd:00 1276920 /home/abhisheks/projects/HSS/Implementation/app/a.out
08114000-08117000 rwxp 000cc000 fd:00 1276920 /home/abhisheks/projects/HSS/Implementation/app/a.out
082fa000-083a0000 rwxp 082fa000 00:00 0
4276e000-42787000 r-xp 00000000 fd:00 7072496 /lib/ld-2.5.so
42787000-42788000 r-xp 00018000 fd:00 7072496 /lib/ld-2.5.so
42788000-42789000 rwxp 00019000 fd:00 7072496 /lib/ld-2.5.so
427f2000-42804000 r-xp 00000000 fd:00 7072509 /lib/libnsl-2.5.so
42804000-42805000 r-xp 00012000 fd:00 7072509 /lib/libnsl-2.5.so
42805000-42806000 rwxp 00013000 fd:00 7072509 /lib/libnsl-2.5.so
42806000-42808000 rwxp 42806000 00:00 0
4313d000-43274000 r-xp 00000000 fd:00 7072497 /lib/libc-2.5.so
43274000-43276000 r-xp 00137000 fd:00 7072497 /lib/libc-2.5.so
43276000-43277000 rwxp 00139000 fd:00 7072497 /lib/libc-2.5.so
43277000-4327a000 rwxp 43277000 00:00 0
4327c000-432a1000 r-xp 00000000 fd:00 7072499 /lib/libm-2.5.so
432a1000-432a2000 r-xp 00024000 fd:00 7072499 /lib/libm-2.5.so
432a2000-432a3000 rwxp 00025000 fd:00 7072499 /lib/libm-2.5.so
432a5000-432a7000 r-xp 00000000 fd:00 7072498 /lib/libdl-2.5.so
432a7000-432a8000 r-xp 00001000 fd:00 7072498 /lib/libdl-2.5.so
432a8000-432a9000 rwxp 00002000 fd:00 7072498 /lib/libdl-2.5.so
432ab000-432be000 r-xp 00000000 fd:00 7072500 /lib/libpthread-2.5.so
432be000-432bf000 r-xp 00012000 fd:00 7072500 /lib/libpthread-2.5.so
432bf000-432c0000 rwxp 00013000 fd:00 7072500 /lib/libpthread-2.5.so
432c0000-432c2000 rwxp 432c0000 00:00 0
43ceb000-43cf6000 r-xp 00000000 fd:00 7072519 /lib/libgcc_s-4.1.1-20070105.so.1
43cf6000-43cf7000 rwxp 0000a000 fd:00 7072519 /lib/libgcc_s-4.1.1-20070105.so.1
43cf9000-43dd9000 r-xp 00000000 fd:00 14021099 /usr/lib/libstdc++.so.6.0.8
43dd9000-43ddc000 r-xp 000e0000 fd:00 14021099 /usr/lib/libstdc++.so.6.0.8
43ddc000-43dde000 rwxp 000e3000 fd:00 14021099 /usr/lib/libstdc++.so.6.0.8
43dde000-43de4000 rwxp 43dde000 00:00 0
b7d00000-b7d21000 rwxp b7d00000 00:00 0
b7d21000-b7e00000 --xp b7d21000 00:00 0
b7e16000-b7e69000 rwxp b7e16000 00:00 0
b7e69000-b7ecd000 r-xp 00000000 fd:00 13823471 /app/oracle/product/11.1.0/db/oracore/zoneinfo/timezlrg.dat
b7ecd000-b7ef4000 rwxp b7ecd000 00:00 0
b7efe000-b7f02000 rwxp b7efe000 00:00 0
bfe9c000-bfeb0000 rwxp bfe9c000 00:00 0 [stack]
bfeb0000-bfeb1000 rw-p bfeb0000 00:00 0
Aborted (core dumped)
there's another problem that am facing with the code.... its like that if i change the size of the data then for some data size it does not give any error, the programm executes smoothely..... Am running the code on limited user on a linux machine, but if I run the same code for a root user there's never an error.....
Kindly help me.. am stuck in it for past three days.... any help will be appreciated