头文件
class CThreadSlotData
{
public:
CThreadSlotData();
//提供给用户的接口函数
int AllocSlot();
void FreeSlot(int nSlot);
void SetValue(int nSlot, void* pValue);
void* GetThreadValue(int nSlot);
void DeleteValues(HINSTANCE hInst, BOOL bAll=FALSE);
DWORD m_tlsIndex; //用来访问系统提供的线程局部存储
int m_nAlloc; //m_pSlotData所指向数组的大小
int m_nRover; //为了快速找到一个空闲的槽而设定的值
int m_nMax; //占用槽的最大数目
CSlotData* m_pSlotData; //标识每个槽状态的全局数组的首地址
CTypedSimpleList<CThreadData*>m_list; //CThreadData结构的列表
CRITICAL_SECTION m_cs;
void* operator new(size_t, void*p)
{ return p; }
void DeleteValues(CThreadData* pData, HINSTANCE hInst);
~CThreadSlotData();
};
cpp文件
BYTE __afxThreadData[sizeof(CThreadSlotData)]; //为下面的_afxThreadData变量提供内存
CThreadSlotData* _afxThreadData; //定义全局变量分配空间
类重载了new运算符,operator new函数并不真正为对象分配内存空间,仅仅返回参数中的指针作为对象的首地址。例如初始化_afxThreadData指针所用的代码如下:
_afxThreadData = new (__afxThreadData) CThreadData;.
C++语言标准规定的new表达式的语法是:
[::] new [placement] new-type-name [new-initializer]
如果重载了的new函数有除size_t以外的参数的话,要把它们写再placement域。type-name域指定了要被初始化的对象的类型。编译器在调用完operator new以后,还要调用此类型中的构造函数去初始化对象。如果类的构造函数需要传递参数的话,应该在initializer域指定。
通过上一篇转载的文章知道 new 操作符的执行过程:
①.调用operator new分配内存 ;
②.调用构造函数生成类对象;
③.返回相应指针。
这里重载了operator new, 没有分配内存而是返回参数中的指针。