I am working on Solaris 8, Sun C++ 5.3 compiler and dbx 6.2. dbx is showing memory access error at following line:_
virtual int insert( keyType1_t keyVal, dataType1_t& info_t) >>>> {
>>>>
pair<map<keyType1_t,dataType1_t>::iterator,bool>
retItor;"
{code}
_*Code is as follows:*_
{code}
#include<iostream>
#include<map>
using namespace std;
struct MsgS
{
unsigned long key;
int element;
};
template<class keyType_t, class dataType_t>
class AbsC
{
public:
AbsC();
AbsC( keyType_t, dataType_t );
virtual int insert( keyType_t, dataType_t& ) = 0 ;
virtual int remove( keyType_t, dataType_t* ) = 0 ;
virtual int search( keyType_t, dataType_t* ) = 0 ;
~AbsC();
protected:
keyType_t keyValue;
dataType_t info;
};
template<class keyType1_t, class dataType1_t>
class WrapperC : public AbsC<keyType1_t, dataType1_t>
{
protected:
map<keyType1_t, dataType1_t> InfoMap_obj;
typedef map<keyType1_t, dataType1_t> InfoMap;
typename typedef map<keyType1_t, dataType1_t>::iterator InfoMap_itor;
typedef typename pair<typename map<keyType1_t,dataType1_t>::iterator,bool> InfoMap_pairItor;
public:
WrapperC( keyType1_t arg1, dataType1_t arg2) ;
virtual int insert( keyType1_t keyVal, dataType1_t& info_t)
{
pair<map<keyType1_t,dataType1_t>::iterator,bool> retItor;
retItor = InfoMap_obj.insert( pair<keyType1_t, dataType1_t>(keyVal, info_t ) );
if ( retItor.second == false )
{
cout<<"\n Element alread exists";
return (-1);
}
return (1);
};
virtual int remove( keyType1_t keyVal, dataType1_t* info_tp)
{
InfoMap_itor retItor;
retItor = InfoMap_obj.find(keyVal) ;
if(retItor == InfoMap_obj.end())
{
cout <<"\n key not found";
info_tp = NULL;
return (-1);
}
*info_tp = retItor->second;
InfoMap_obj.erase( InfoMap_obj.find(keyVal) );
return (1);
};
virtual int search( keyType1_t keyVal, dataType1_t* info_tp)
{
//dataType_t infoRet;
InfoMap_itor retItor;
retItor = InfoMap_obj.find( keyVal );
if(retItor == InfoMap_obj.end() )
{
cout<<"\n key not found";
cout << endl << "search key: \"" << keyVal << "\"" << endl;
//displayDataFrom();
info_tp = NULL;
return ( -1 );
}
*info_tp = retItor->second;
return( 1 );
};
~WrapperC(){};
//Copy constructor
WrapperC( const WrapperC& mapWrapper_o )
{
if( &mapWrapper_o != NULL )
{
this->subsInfoMap_obj = mapWrapper_o.InfoMap_obj ;
}
};
//Assignment Operator Overlaoding
WrapperC& operator= ( const WrapperC& mapWrapper_o )
{
if( ( this != &mapWrapper_o ) && ( &mapWrapper_o != NULL ) )
{
this->InfoMap_obj = mapWrapper_o.InfoMap_obj ;
this->noOfElem_ul = mapWrapper_o.noOfElem_ul ;
}
return ( *this ) ;
};
};
template<class keyType_t, class dataType_t>
AbsC<keyType_t, dataType_t>::AbsC()
{
}
template<class keyType_t, class dataType_t>
AbsC<keyType_t, dataType_t>::AbsC( keyType_t argkeyValue, dataType_t info_t)
{
info = info_t;
keyValue = argkeyValue;
}
template<class keyType_t, class dataType_t>
AbsC<keyType_t, dataType_t>::~AbsC()
{
}
template<class keyType1_t, class dataType1_t>
WrapperC<keyType1_t, dataType1_t>::WrapperC( keyType1_t key_t, dataType1_t info_t):AbsC( key_t, info_t)
{
}
int main()
{
struct MsgS msgS;
struct MsgS* msgR;
msgR = new struct MsgS;
msgS.key = 123456;
msgS.element = 1;
WrapperC<unsigned long, struct MsgS> objS(msgS.key, msgS);
int b = objS.insert( msgS.key, msgS);
//int b = objS.insert( msgS.key, msgS.key);
// adding 2 element
msgS.key = 123454;
msgS.element = 2;
b = objS.insert( msgS.key, msgS);
//remove elem
b = objS.remove(12, msgR);
if ( b == 1 )
cout<<"\n ret value for remove elem "<<msgR->key << "\t" << msgR->element<<endl;
b = objS.remove(123456, msgR);
if ( b == 1 )
cout<<"\n ret value for remove elem "<<msgR->key << "\t" << msgR->element<<endl;
b = objS.search(78912, msgR);
if ( b ==1 )
cout<<"\n ret value for search elem "<<msgR->key << "\t" << msgR->element<<"\n";
b = objS.search(123454, msgR);
if ( b == 1 )
cout<<"\n ret value for search elem "<<msgR->key << "\t" << msgR->element<<endl;
return 1;
}
[
|http://forums.sun.com/codeSnippetPopup.jsp?csid=362232]
[
|javascript:selectElementById('codeSnippet362232');]{code}
_*dbx report
Attempting to read 4 bytes at address
0xffbee8c8
which is 192 bytes above the current stack pointer
=>[1]
__rwstd::__rb_tree<unsigned long,std::pair<const unsigned
long,MsgS>,__rwstd::__select1st<std:
:pair<const unsigned
long,MsgS>,unsigned long>,std::less<unsigned
long>,std::allocator<std::pair<con
st unsigned long,MsgS>
::iterator::iterator(0xffbee93c, 0xffbee8c8, 0x2, 0xfb8,
0xfe960c00, 0xff8
), at 0x305f4
[2]
std::pair<__rwstd::__rb_tree<unsigned long,std::pair<const
unsigned long,MsgS>,__rwstd::__sele
ct1st<std::pair<const
unsigned long,MsgS>,unsigned long>,std::less<unsigned
long>,std::allocator<std
::pair<const unsigned long,MsgS>
::iterator,bool>::pair(this = 0xffbee93c), line 106 in
"utility"
[3] WrapperC<unsigned long,MsgS>::insert(this = 0xffbeea0c,
keyVal = 123456U, info_t = STRUCT), li
ne 42 in "sample.cc"
[4] main(),
line 138 in "sample.cc"
<rtc> Read from uninitialized
(rui):
Attempting to read 4 bytes at address 0xffbee8c8
which is 192
bytes above the current stack pointer
=>[1]
__rwstd::__rb_tree<unsigned long,std::pair<const unsigned
long,MsgS>,__rwstd::__select1st<std:
:pair<const unsigned
long,MsgS>,unsigned long>,std::less<unsigned
long>,std::allocator<std::pair<con
st unsigned long,MsgS>
::iterator::iterator(0xffbee93c, 0xffbee8c8, 0x2, 0xfb8,
0xfe960c00, 0xff8
), at 0x305f4
[2]
std::pair<__rwstd::__rb_tree<unsigned long,std::pair<const
unsigned long,MsgS>,__rwstd::__sele
ct1st<std::pair<const
unsigned long,MsgS>,unsigned long>,std::less<unsigned
long>,std::allocator<std
::pair<const unsigned long,MsgS>
::iterator,bool>::pair(this = 0xffbee93c), line 106 in
"utility"
[3] WrapperC<unsigned long,MsgS>::insert(this = 0xffbeea0c,
keyVal = 123454U, info_t = STRUCT), li
ne 42 in "sample.cc"
[4] main(),
line 143 in "sample.cc"
I wonder whether it is false positive.
-Thanks in advance