new的重载问题

zbzjy2008 2010-11-27 09:56:50
MemoryPool.h
class MemoryBlock
{
public:
unsigned short nsize;
unsigned short nfree;
unsigned short nfrist;
MemoryBlock *pNext;
char Data[1];
public:
MemoryBlock(unsigned short nNum,unsigned nUnitSize);
~MemoryBlock(){}
static void* operator new(size_t,unsigned short nNum,unsigned short nUnitSize)
{
return ::operator new(sizeof(MemoryBlock)+nNum*nUnitSize);
}
static void operator delete(void* p,size_t)
{
::operator delete(p);
}
};

这个类里重载了new和delete
调用new
MemoryBlock *temp=new(UnitSize,InitSize)MemoryBlock(UnitSize,InitSize);后
编译器出个警告:
warning C4291: “void *MemoryBlock::operator new(size_t,unsigned short,unsigned short)”: 未找到匹配的删除运算符;如果初始化引发异常,则不会释放内存
1> d:\code\c++\memorypool\memorypool\memorypool.h(16) : 参见“MemoryBlock::operator new”的声明
delete不是也重载了吗??怎么还会出这个警告????求高手指点下。。。。
...全文
123 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluewanderer 2010-11-28
  • 打赏
  • 举报
回复
这种带参数的new或者delete叫 placement new/delete。placement delete唯一会被用到的地方就是对应的placement new在调用构造函数的时候出现异常,需要释放内存的时候。

因为placement new可能申请也可能没申请内存,所以需要配对的delete。按C++规范placement delete不应该在其他任何地方被用到。

...所以,再写一个
static void operator delete(void *p)
{
::operator delete(p);
}

既然都能上网,感觉这方面资料应该很容易能查到的。
zbzjy2008 2010-11-28
  • 打赏
  • 举报
回复
非常感谢。。。。。。。。。。
zbzjy2008 2010-11-27
  • 打赏
  • 举报
回复
谢谢 2,3楼。。。我还想再问下。。。这样函数声明修改后。。我直接调用delete temp会出错应该怎么写。。。。
luciferisnotsatan 2010-11-27
  • 打赏
  • 举报
回复
怎么new,怎么delete
cswuyg 2010-11-27
  • 打赏
  • 举报
回复
应该是楼上那样子。
delete的参数要跟new的匹配。
bluewanderer 2010-11-27
  • 打赏
  • 举报
回复
static void operator delete(void* p,unsigned short nNum,unsigned short nUnitSize)
{
::operator delete(p);
}

64,683

社区成员

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

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