【发布时间】:2012-10-01 08:52:12
【问题描述】:
我正在尝试打印调用 addref 和 release 的哪一行。这里是代码
在下面的代码中,我创建了 ReferenceCount 类,其主要功能是增加和减少引用计数。 Referencemanager 类跟踪引用计数并在达到 0 时删除对象。
Test1 是测试类。在 main 中,我正在创建 Test1 指针并用 CReferenceManager 类包装它。现在在创建 CReferenceManager 类时调用 AddRef 并在销毁时调用 Release。
如果存在内存泄漏,那么当 AddRef 和 Release 调用时使用引用计数时,我是否可以打印出 FILE 和 LINE 编号会更容易检测。
如果有一种方法可以打印调用 AddRef 和 Release 的 FILE 和 LINE 编号。一种方法是我可以覆盖派生类中的 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);
}
我发布的类似问题 finding who creates object via smart pointer Design pattern to detect memory leaks for reference counted smart pointers
但没有一个答案给出正确的解释来解决这个问题,
【问题讨论】:
-
delete this;OMG!!! -
您是使用智能指针调用 AddRef / Release 还是手动调用它们?如果您手动调用它们,我强烈建议您不要这样做。
-
模板会是更好的解决方案;可以使模板适合每个对象,就像 std::shared_ptr
-
@std''OrgnlDave : 你能给我举个例子吗
-
@BЈовић parashift.com/c++-faq-lite/delete-this.html :)
标签: c++ pointers memory-leaks reference-counting