zoukankan      html  css  js  c++  java
  • 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*,这两个参数是对应的,其他参数必须一致。

  • 相关阅读:
    翻译:Razor剖析之第4部分:Razor页面
    学习第二十二天
    jQuery:选择器和事件
    学习第二十天@简单json+上传文件+Ado存储过程
    统计指定时间段内的周未(非周未)天数
    c#动态创建内存模型(笔记)
    cmd命令 任务计划 详解
    BAT教程:第四节(批处理中的变量)
    103个Windows XP运行命令
    BAT教程 :第二节(for命令详解 )
  • 原文地址:https://www.cnblogs.com/clark-lee/p/3894289.html
Copyright © 2011-2022 走看看