sto cercando di stampare su quale linea AddRef e il rilascio è called.Here è codiceRilevamento perdita di memoria in riferimento contato oggetti
Nel codice qui sotto ho creato sulla classe ReferenceCount cui funzionalità principale per aumentare e diminuire conteggio refernce. La classe Referencemanager tiene traccia del conteggio dei riferimenti e cancella l'oggetto quando raggiunge 0.
Test1 è una classe di test. In generale sto creando il puntatore Test1 e lo avvolgo con la classe CReferenceManager. Ora durante la creazione della classe CReferenceManager viene chiamato AddRef e viene chiamata la versione di distruzione.
Se è presente una perdita di memoria, sarebbe più facile rilevare se è possibile stampare i numeri FILE e LINE quando AddRef e Release sono chiamati con conteggi di riferimento in quel punto.
Se esiste un modo per stampare FILE e il numero LINE da cui vengono chiamati AddRef e Release. Un modo è che posso sovrascrivere AddRef e Release nelle classi derivate e FILE e LINE numeri prinf
domande//ReferenceCount.h
#include <string>
#include <Windows.h>
using namespace std;
class CReferenceCount
{
public:
CReferenceCount();
virtual ~CReferenceCount();
virtual void AddRef();
virtual bool Release();
private:
LONG m_ref;
};
// RefCount.cpp
//
#include "stdafx.h"
#include "ReferenceCount.h"
CReferenceCount::CReferenceCount():m_ref(0)
{
AddRef();
}
CReferenceCount::~CReferenceCount()
{
}
void CReferenceCount::AddRef()
{
InterlockedIncrement(&m_ref);
}
bool CReferenceCount::Release()
{
if (InterlockedDecrement(&m_ref) == 0)
{
delete this;
return true;
}
return false;
}
//ReferenceManager.h
#include <string>
#include <Windows.h>
using namespace std;
class CReferenceCount
{
public:
CReferenceCount();
virtual ~CReferenceCount();
virtual void AddRef();
virtual bool Release();
private:
LONG m_ref;
};
//test.cpp
#include "stdafx.h"
#include "ReferenceCount.h"
#include "RefManager.h"
#include <iostream>
using namespace std;
class Test1: public CReferenceCount
{
public:
Test1(){}
~Test1(){}
private :
int m_i;
};
void main()
{
Test1 *pTest= new Test1();
CReferenceManager<Test1> testRef(pTest);
}
similare ho postato finding who creates object via smart pointer Design pattern to detect memory leaks for reference counted smart pointers
ma non delle risposte dare spiegazione giusta per affrontare questo proble
'cancella questo;' OMG !!! –
usi il puntatore intelligente per chiamare AddRef/Release o li chiami manualmente? Se li chiami manualmente, ti consiglio vivamente di non farlo. –
un modello sarebbe una soluzione migliore; il modello può essere creato per adattarsi a ogni oggetto, proprio come un std :: shared_ptr –