class CIMSSubscription : public CBaseRecClass
{
public:
CIMSSubscription() : CBaseRecClass(ClassRecSubsIMS) {}
CIMSSubscription(const string & sIMSI, const string & sPubId);
~CIMSSubscription() { m_mPrivateId2SubsIMS.erase(m_sPrivateId); }
struct PublicIdInfo
{
hssCx::ns1__tServiceProfile * pServiceProfile; // 23.228 5.2.1a Public user Ids belong to registration set
// *may* point to different or the same service profiles
string sRecName;
PublicIdInfo() : bBarringIndication(false), eIdType(DISTINCT_PUBLIC_USER_IDENTITY), pServiceProfile(0) {}
PublicIdInfo(soap * pSoap, const string & sPubId, const string & _sRecName, const bool bBarred = false, const IdentityType eType = DISTINCT_PUBLIC_USER_IDENTITY)
: sIdentity(sPubId), bBarringIndication(bBarred), eIdType(eType), pServiceProfile(0), sRecName(_sRecName)
{
pServiceProfile = hssCx::soap_new_ns1__tServiceProfile(pSoap, -1);
}
// REF LINE #2
~PublicIdInfo() { if (pServiceProfile)
{
soap_delete_ns1__tServiceProfile(pServiceProfile->soap, pServiceProfile);} }
const string PublicIdTypeAsText() const;
};
struct PublicRegInfo
{
enum IMSRegStatus { IMSRegStatusNone, IMSRegStatusRegistered, IMSRegStatusUnregistered };
IMSRegStatus eRegStatus;
string sS_CSCF;
bool bIsIMSAuthPending;
u32 nRegisterSetNum;
map<string, PublicIdInfo> mPublicId2PublicIdInfo; // implicit registration set if > 1 entry in map
string sRecName;
PublicRegInfo() {}
PublicRegInfo(const string & sPubId, const string & _sRecName)
: eRegStatus(IMSRegStatusNone), bIsIMSAuthPending(false), nRegisterSetNum(0), sRecName(_sRecName)
{
static u16 nSeedRegisterSetNum = 1;
nRegisterSetNum = nSeedRegisterSetNum++;
// REF LINE:1
mPublicId2PublicIdInfo[sPubId] = PublicIdInfo(new soap(SOAP_IO_KEEPALIVE), sPubId, _sRecName);
}
PublicRegInfo * FindNoneBarredPublicId() const;
PublicIdInfo * GetPublicIdInfo(const string & sPubId) const;
string DownloadIMSUserProfile(const string & sPrivateId) const;
const string IMSRegStatusAsText() const;
};
const string & GetPrivateId () const { return m_sPrivateId; }
bool FindAnyRegisteredS_CSCF(string & sS_CSCF) const;
bool FindAnyUnregisteredS_CSCF(string & sS_CSCF) const;
PublicRegInfo * GetPublicRegInfo(const string & sPublicId) const;
const string IMSSubscriptionAsText() const;
static bool GetPublicRegInfoFromPublicId(const string & sPublicId, PublicRegInfo & stPublicInfo, CIMSSubscription & cSubsIMS);
private:
string m_sPrivateId;
vector<PublicRegInfo> m_vPublicRegInfo;
static map<string, CIMSSubscription*> m_mPrivateId2SubsIMS;
};
When creating the new class of the type CIMSSubscription, the breakpoint gets hit at "REF LINE1", ie mPublicId2PublicIdInfo[sPubId] = PublicIdInfo(new soap(SOAP_IO_KEEPALIVE), sPubId, _sRecName); where the map mPublicId2PublicIdInfo gets filled. And during this time the construtor for the PublicIdInfo called and finally the destructor for the PublicIdInfo is called. But when calling the destructor for the "PublicIdInfo" it is also deleting a pointer "pServiceProfile" which is also stored in the mPublicId2PublicIdInfo.
So my question is how to add a new map element to "mPublicId2PublicIdInfo" without calling the destructor for the element "PublicIdInfo" ?
thanks a lot for helping a non C++ guy (but with domain knowlege ) in the C++ world