重载new出现error C2660

lood339 2009-02-28 06:22:19
我在 CJHPolygon的类中重载了new,方法如下

//相关的私有成员变量
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);
}


我调用CJHPolygon * ip5 = new CJHPolygon; 时出现这样的错误
error C2660: 'new' : function does not take 2 parameters
指向了XMEMORY中的 {new ((void _FARQ *)_P) _T1(_V); }
还有see reference to function template instantiation 'void __cdecl

std::_Construct(class CJHPolygon *,const class CJHPolygon &)' being

compiled 的提示,

请有这方面经验的人指点一下,谢谢
...全文
190 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
三分001 2009-08-21
  • 打赏
  • 举报
回复

cout<<"测试一下"<<endl;
mujiok2003 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lood339 的回复:]
new一个一般的对象不会出错,出错的地方在
list <CJHPolygon> polygonList1;
list <CJHPolygon> polygonList2;

polygonList2 = polygonList1;

错误指向xmemory,怀疑是STL的问题。
[/Quote]
这就是问题的关键,增加一个拷贝构造函数。因为在stl的分配器需要调用alloctor::construct(...)。
lood339 2009-03-01
  • 打赏
  • 举报
回复
new一个一般的对象不会出错,出错的地方在
list<CJHPolygon> polygonList1;
list<CJHPolygon> polygonList2;

polygonList2 = polygonList1;

错误指向xmemory,怀疑是STL的问题。
lood339 2009-03-01
  • 打赏
  • 举报
回复
1.改成void* operator new(size_t size)后,编译的时候,编译器无法识别m_freeStore等成员变量。我看了相关书
C++ primer中在定义静态函数时,使用CJHPolygon::的域说明符。

但是编译提示好像是提示多传了this指针这个意思。

2.用static_cast后,产生编译错误error C2440: 'static_cast' : cannot convert from
'char *' to 'class CJHPolygon *',原因不是很清楚,供参考

tangshuiling 2009-02-28
  • 打赏
  • 举报
回复

两个地方的问题:
其一,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;
}


  • 打赏
  • 举报
回复
这里有重载new的,可以参考下;
http://topic.csdn.net/t/20010825/02/255443.html
调用方式改为CJHPolygon * ip5 = new CJHPolygon[5];这样看可以不?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧