• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c++new和delete操作符的重载

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

先分析一条语句:

Base *pb= new Base;

这条语句是怎么执行的?首先,这个函数调用标准C++的operator new()函数,然后调用Base的构造函数。

如果我们自定义new时,可以自定义一个new,如

class Base {
    static void* operator new(size_t size) {
    }
    static void operator delete(void *p) {
    }
}

这个Base类里面的new 和delete覆盖掉标准new和标准delete,当new Base()的时候,调用的自定义的new。

new和delete也可以重载

class Base {
    static void* operator new(size_t size) {
    }
    static void operator delete(void *p) {
    }
    static void operator new(size_t size, std::ostream& out) {
    }
    static void operator delete(void *p,std::ostream& out) {
    }
}

重载的称为placement new 和placement delete。要调用placement new, 可以这样

 

Base *pb = new (std::cerr) Base;

至于调用placement delete,这个是不能通过delete操作符条用的的,它是为异常处理设置的。如果

Base *pb = new (std::cerr) Base;
delete pb;

调用的是operator delete(void *p),不会调用placement delete。

placement 是为异常处理设置的,接下来讲异常处理。

Base *pb= new Base;

这条命令调用两个函数,一个是operator new()分配内存空间,另一个是Base构造函数。如果Base构造函数抛出异常,那么分配之后的空间无法手段delete。因为没有指针指向这一区域。这个问题由C++自身完成,如果苟晗函数抛出异常,C++会自动调用相对应的operator delete()函数。如

Base *pb1 = new Base;
//调用operator delete(void*);
Base *pb2 = new (std::cerr) Base;   
//调用operator delete(void*,std::ostream);

相对应指针式参数项对应,当然new中必有一个size_t,delete中必有一个void*,这两个参数是对应的,其他参数必须一致。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C语言回顾-字符串指针发布时间:2022-07-13
下一篇:
关于C++中对私有的测试总结发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap