addrefとreleaseが呼び出される行を印刷しようとしています。コードは次のとおりです。
以下のコードでは、参照数を増減する主な機能を持つReferenceCountクラスを作成しました。Referencemanagerクラスは、参照カウントを追跡し、オブジェクトが0に達するとオブジェクトを削除します。
Test1はテストクラスです。主に、Test1ポインターを作成し、CReferenceManagerクラスでラップしています。これで、CReferenceManagerクラスの作成中にAddRefが呼び出され、破棄中にReleaseが呼び出されます。
メモリリークがある場合は、AddRefとReleaseがその時点で参照カウントを使用して呼び出されたときに、FILE番号とLINE番号を出力できるかどうかを簡単に検出できます。
AddRefとReleaseが呼び出された場所からFILE番号とLINE番号を出力できる方法がある場合。1つの方法は、派生クラスのAddRefとRelease、およびprinfのFILE番号とLINE番号を上書きできることです。
//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);
}
参照カウントされたスマートポインターのメモリリークを検出するためのスマートポインターデザインパターンを介してオブジェクトを作成する人を見つけることを 投稿した同様の質問
しかし、答えのどれもこの問題に取り組むための正しい説明を与えません、