gpt4 book ai didi

c++ - 检测引用计数对象中的内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:04:19 25 4
gpt4 key购买 nike

我正在尝试打印调用 addref 和 release 的那一行。这是代码

在下面的代码中,我创建了 ReferenceCount 类,其主要功能是增加和减少引用计数。Referencemanager 类跟踪引用计数并在它达到 0 时删除对象。

Test1 是测试类。主要是我正在创建 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

但没有一个答案给出正确的解释来解决这个问题,

最佳答案

唯一的方法是定义调用 AddRef 和 Release 的宏,因为函数无法在内部知道从哪里调用它们。所以你可以使用类似的东西。

#define RELEASE(obj) cout << __LINE__ << ":" << __FILE__ << endl; (obj).Release();

此外,不同的编译器有不同的预定义宏;如果可移植性是一个问题,那么在编写上述代码时应该考虑这一点。 MSDN reference (2003)

鉴于您在下方的评论,我可能会提供另一种有点老套的解决方案。您可能看不到您的引用资料发布的位置,但您可以获得有关其创建位置以及哪些未正确发布的更多信息。

template <typename T>
struct CReferenceManager
{
CReferenceManager(const T & _obj, const string & _file, int _line) : mObj(_obj), mFile(_file), mLine(_line)
{
cout << "Constructing from " << _file << ":" << _line << endl;
CReferenceManager::sObjects[make_pair(mFile, mLine)]++;
mObj.addRef();
}

~CReferenceManager()
{
cout << "Destructing object created at " << mFile << ":" << mLine << endl;
CReferenceManager::sObjects[make_pair(mFile, mLine)]--;
mObj.Release();
}

static map<pair<string, int>, int> sObjects;
string mFile;
int mLine;
T obj;
}

int main()
{
...
// Cycle through sObjects before return, note any unreleased entries
return 0;
}

注意这只是伪代码;我怀疑它是否可以编译或开箱即用!

关于c++ - 检测引用计数对象中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12826887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com