首页 > 代码库 > c++ new和delete操作符的重载
c++ new和delete操作符的重载
先分析一条语句:
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*,这两个参数是对应的,其他参数必须一致。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。