C++ 内存管理与封装类

在阅读开源HPSOCKET 底层代码时,对于内存管理和封装类新的理解。

对于内存管理方面,总是害怕在运行过程中出现各种各样的内存泄漏问题,我曾经想过利用封装类对new和delete进行管理,却总是差点感觉,依旧用起来那么麻烦。

而作者巧妙的利用了模板和封装解决了这个问题。

例如 读写锁类 仅仅只需要使用的方法

class CSWMR
{
public:
	VOID WaitToRead();
	VOID WaitToWrite();
	VOID ReadDone()  { Done(); }
	VOID WriteDone() { Done(); }

private:
	VOID Done();

public:
	CSWMR();
	~CSWMR();

private:
	CSWMR(const CSWMR&);
	CSWMR operator = (const CSWMR&);

private:
	int m_nWaitingReaders;		//等待读的客户端数
	int m_nWaitingWriters;		//等待写的客户端数
	int m_nActive;				//活跃的客户端数

	CSpinGuard	m_cs;
	CSEM		m_smRead;
	CSEM		m_smWrite;
};

将其重命名typedef CSWMR CSimpleRWLock;

写个对于读操作的锁模板类  在构造函数进行初始化以及功能函数 析构时自动处理

template<class CLockObj> class CLocalReadLock
{
public:
	CLocalReadLock(CLockObj& obj) : m_wait(obj) { m_wait.WaitToRead(); }
	~CLocalReadLock() { m_wait.ReadDone(); }
private:
	CLocalReadLock(const CLocalReadLock&);
	CLocalReadLock operator = (const CLocalReadLock&);
private:
	CLockObj& m_wait;
};

typedef CLocalReadLock<CSimpleRWLock> CReadLock;

//读操作 线程到达进行等待读取。直到读取完毕。自动析构


比如在读文件的函数Readfile()

{

CReadLock readLock;

}

在函数处理时自动对线程数据进行加锁保护 --如果有别的线程在进行读写操作则等待对方操作完成继续执行

离开函数时临时对象自动析构。进行Unlock行为。

这样对于内存管理就十分明朗了。



阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页