ciao.
Ho uno smart pointer CComQIPtr<_cSapModel>.
lo carico con un getter da un altro oggetto com CComQIPtr<_SapObject> m_pSap
cosi:
a questo punto passo lo smart pointer a due classi in cui è utilizzato come variabile membro:codice:Classe Init { Init::~Init(){ m_pSapModel.Release(); m_pSap.Release(); } . . . Init::Create(){ hr = m_pSap.CoCreateInstance(__uuidof(SapObject), NULL, CLSCTX_LOCAL_SERVER); m_pSapModel = m_pSap->Get_SapModel(); CSapDataLoadIteratorApi* pA= new CSapDataLoadIteratorApi(); CSapStressIteratorApi* pB= new CSapStressIteratorApi(); pA->Initialize(m_pSapModel); pB->Initialize(m_pSapModel); } };
a questo punto lo uso dentro le classi CSapDataLoadIteratorApi e CSapDataLoadIteratorApi.codice:Class CSapDataLoadIteratorApi { CSapDataLoadIteratorApi::~CSapDataLoadIteratorApi() { if(m_pSapModel) m_pSapModel.Detach();//probabilmente non serve perchè ho chiamato Release su m_pModel } void CSapDataLoadIteratorApi::Initialize(CComQIPtr<_cSapModel> sapModel) { m_pSapModel.Attach(sapModel); } }; e Classe CSapStressIteratorApi { CSapStressIteratorApi::~CSapStressIteratorApi(void) { if(m_pSapModel) m_pSapModel.Detach();//probabilmente non serve perchè ho chiamato Release su m_pModel } void CSapStressIteratorApi::Initialize(CComQIPtr<_cSapModel> sapModel) { m_pSapModel.Attach(sapModel); } };
alla fine distruggo l'oggetto com a partire dal distruttore della classe Init(con i release) e alla
fine distruggo i due oggetti CSapDataLoadIteratorApi e CSapDataLoadIteratorApi.
solo che l'applicazione rimane in memoria , l'ho visto col task manager.
come leggere il conteggio del reference counter degli smart pointer,per regolarsi e debuggare ,dato che non si puo chiamare direttamente
la funzione release incapsulata nel CComQIPtr che dovrebbe ritornare questo conteggio
ma è privata e non so se è corretto utilizare il CComQIPtr.
grazie

Rispondi quotando