operator new有时候会用到,以下是常用的方式:
第一种方式:
class MemBlock1
{
public:
MemBlock1(int len)
{
nLen = len;
pData = (char*)malloc(len);
memset(pData,0,nLen);
printf("constructor\n");
}
~MemBlock1()
{
free(pData);
printf("destructor\n");
}
void* operator new(size_t size)
{
mem = new char[size];
void* addr = (void*)mem;
printf("new %0x \n",addr);
return addr;
}
void assignval(char* pdata,int len)
{
if(len > nLen)
return;
strncpy(pData,pdata,len);
pData[len-1] = '\0';
}
void operator delete(void* p,size_t size)
{
char* pd = (char*)p;
printf("delete %d,%0x\n",(int)size,pd);
delete[] mem;
}
void Show()
{
printf(pData);
printf("\n");
}
public:
static char* mem;
char* pData;
int nLen;
};
char* MemBlock1::mem = NULL;
第二种方式:
class MemBlock2
{
public:
unsigned int nSize;
char aData[1];
void* operator new(size_t,unsigned int _nSize)
{
return ::operator new(sizeof(MemBlock2)+_nSize);
}
void operator delete(void* p,size_t)
{
::operator delete(p);
}
MemBlock2(unsigned int _nSize):nSize(_nSize)
{
char* pData = aData;
*reinterpret_cast<unsigned short*>(pData) = (unsigned short)1;
}
};
使用方式:
int len = 1024*1024;
MemBlock1* pMB = new MemBlock1(len);//MemBlock2* pMB = new(len) MemBlock2(len);
FILE *fr ;
fr = fopen("1.txt","r");
fread(pMB->pData,1,len,fr);
pMB->pData[len-1]='\0';
fclose(fr);
delete pMB;
参考:
C++应用程序性能优化