C++ 笔记,重载new , delete 操作符

1.简述:

   (1).自定义重载全局的new 和 delete,在使用new新增对象和delete对象时,会调用自定义全局的new和delete操作,c++内部类也(如char,int等)不例外,同样会调用自定义的new和delete。

   (2).也可以定义作用域为当前类的new和delete,即像在类中重载其他操作符一样。

   (3).重载 new 时,返回值必须为void* , 且参数必须有size_t 参数(也可以有其他参数),此参数是又编译器计算出来的。重载delete时,返回值必须为void,参数为void*类型。

   (4).也可以重载对象数组,和重载对象的区别为在new,delete后面多一个[] 符号即new[],delete[].

   (5).同时重载勒全局的new,delete和类内部的new,delete,以类内部为准。

2.代码实现:

    class A{

        int i;

    public:

        A():i(0){};

        ~A(){};

      //重载new,delete

       void* operator new(size_t sz,void* loc){//分配特定的内存地址loc

             std::cout<<"new size:"<<sz<<"byte"<<std::endl;

             return loc;

       }

     //由于此类采用特定的特定的内存地址,所以最好不要使用delete来释放内存,(如果loc为堆内存,问题还不大,是其他存储空间将会发生灾难)而是直接调用析构函数a->A::~A();

      //void operator delete(void* loc){

        //    std::cout<<"delete"<<std::endl;

        //    ::delete []loc;//什么都没做,直接继承delete操作

      //}

     void* operator new[](size_t sz){
            return ::new char[sz];
        }
        void operator delete[](void *p){
            ::delete []p;
        }

   }

 int main(){

    void* loc = malloc(sizeof(A));

   A *a = new(loc) A();

  a->A::~A();

  //delete a;//由于malloc也是动态分配的内存,这里也可已使用delete来释放内存,但最好不用,且不能和free连用

 free(loc);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值