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