65,211
社区成员
发帖
与我相关
我的任务
分享//相关的私有成员变量
CJHPolygon* m_next;
static CJHPolygon* m_freeStore ;
static const int m_chunk ;
//公有的成员函数
void* CJHPolygon::operator new(size_t size)
{
CJHPolygon* p;
if(!m_freeStore)
{
size_t chunk = m_chunk * size;
p = reinterpret_cast<CJHPolygon*>(new char[chunk]);
m_freeStore = p;
for(; p != &m_freeStore[m_chunk - 1]; ++p)
{
p->m_next = p+1;
}
p->m_next = NULL;
}
p = m_freeStore;
m_freeStore = m_freeStore->m_next;
return p;
}
void CJHPolygon::operator delete(void* p)
{
(static_cast<CJHPolygon*>(p))->m_next = m_freeStore;
m_freeStore = static_cast<CJHPolygon*>(p);
}
cout<<"测试一下"<<endl;
两个地方的问题:
其一,void* CJHPolygon::operator new(size_t size)
new的重载必须是 void* operator new(size_t size)的形式,不能是类中非静态成员函数(this指针隐含的形参)
其二,p = reinterpret_cast<CJHPolygon*>(new char[chunk]);
reinterpret_cast<CJHPolygon*>用于函数指针的强转,如果硬要强转请用static_cast
修改后的代码,仅供参考
static void* operator new(size_t size)
{
CJHPolygon* p;
if(!m_freeStore)
{
size_t chunk = m_chunk * size;
p = static_cast<CJHPolygon*>(::operator new(chunk));
if(!p)
{
do....something //最好预先设置set_new_handler,然后在这里调用以便处理内存不够的情况
throw std::bad_alloc(); //或者直接抛出内存分配失败也可以
}
m_freeStore = p;
for(; p != &m_freeStore[m_chunk - 1]; ++p)
{
p->m_next = p+1;
}
p->m_next = NULL;
}
p = m_freeStore;
m_freeStore = m_freeStore->m_next;
return p;
}