如何在自定义的operator new里使用标准的operator new呢?

alexdboy 2009-02-28 09:40:33
学习《C++ Primer》,讲到new的expression和operator new函数的关系,于是想到让new的expression使用自定义的operator new函数。代码如下


//#include <new>

#include <iostream>
using std::cout;
using std::endl;

class Foo
{
public:
Foo(): m(0){cout << "Foo::Foo()" << endl;}
int m;
};


void* operator new(size_t _Count) throw(std::bad_alloc)
{
cout << "my own operator new, _Cout is " << _Count << endl;
return malloc(_Count);
}

int main(int argc, char *argv[])
{
Foo *p = new Foo;

::operator new(3);

return 0;
}


在VC2005里编译运行,O.K.,挺高兴。
忽然觉得用malloc不够“C++”的风格,这才发现没办法使用原来标准库里的::operator new函数了(把malloc换成operator new,则程序就死循环了)。各位大侠有什么高明的方法吗?
...全文
113 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chin_chen 2009-02-28
  • 打赏
  • 举报
回复
这样吧
void* operator new(size_t _Count,int i) throw(std::bad_alloc)
{
cout << "my own operator new, _Cout is " << _Count << endl;
return ::operator new(_Count);
}

加一个参数吧,这样n程序就可以不用递归调用了。
guiji1988 2009-02-28
  • 打赏
  • 举报
回复
当全局版本的new和delete不能满足整个系统时,对其重载是很极端的方法,如果重载全局版本,就使默认版本完全不能被访问-甚至在这个定义里也不能调用他们。
——《C++编程思想》

楼主的学习精神实在值得学习
  • 打赏
  • 举报
回复
怎么就你用malloc的这段代码,在我的编译器也运行不起来呢?
xuhb95083023 2009-02-28
  • 打赏
  • 举报
回复
可以参考里面的StandardNewDeleteForms类
xuhb95083023 2009-02-28
  • 打赏
  • 举报
回复
这个答案有点长

effective c++
条款52:写了placement new也要写placement delete

里面有你想要的详细答案

65,210

社区成员

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

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