zoukankan      html  css  js  c++  java
  • c++ new与delete运算符的重载

    以成员函数的形式重载 new 运算符:
    void* ClassName::operator new(size_t sz) {
        // TODO;
    }
    以全局函数的形式重载 new 运算符:
    void* operator new(size_t sz) {
        // TODO;
    }

    两种重载形式的返回值相同,都是void *类型,并且都有一个参数,为size_t类型。

    在重载 new 或 new[] 时,无论是作为成员函数还是作为全局函数,它的第一个参数必须是 size_t 类型。

    对于 new 而言 size_t 表示的是要分配空间的大小,对于 new[] 的重载函数而言,size_t 则表示所需要分配的所有空间的总和。

    以成员函数的形式重载 delete 运算符:
    void ClassName::operator delete(void* ptr) {
        // TODO;
    }
    以全局函数的形式重载 delete 运算符:
    void operator delete(void* ptr) {
        // TODO;
    }

    两种形式的重载返回值都是void类型,并且都必须有一个void类型的指针作为参数,该指针指向需要释放的空间。

     
    代码示例:
    #include <iostream>
    #include <string>
    #include <memory>
    
    void* operator new(size_t sz) {
        std::cout << "reload global operator new" << std::endl;
        return malloc(sz);
    }
    
    void operator delete(void* ptr) {
        std::cout << "reload global operator delete" << std::endl;
        free(ptr);
    }
    
    class Test {
    public:
        int a;
        int b;
        Test() {
            std::cout << "Test Constructor" << std::endl;
        }
        ~Test() {
            std::cout << "Test ~Constructor" << std::endl;
        }
        void* operator new(size_t sz) {
            std::cout << "Test reload operator new" << std::endl;
            return malloc(sz);
        }
        void operator delete(void* ptr) {
            std::cout << "Test reload operator delete" << std::endl;
            free(ptr);
        }
    };
    
    int main()
    {
        int* ptr = new int;
        Test* ptr2 = new Test;
        delete ptr;
        delete ptr2;
        return 0;
    }

    输出结果:

    reload global operator new
    Test reload operator new
    Test Constructor
    reload global operator delete
    Test ~Constructor
    Test reload operator delete
  • 相关阅读:
    动态规划 01背包问题
    日常水题 蓝桥杯基础练习VIP-字符串对比
    本博客导航
    2019 ICPC 南昌 (C E G L)
    [模板]线段树
    [模板]手写双端队列(或普通队列)
    2019 ICPC Asia Yinchuan Regional (G, H)
    与超级源点与超级汇点相关的两题POJ 1062, HDU 4725
    [模板]链式向前星
    [总结]关于反向建图
  • 原文地址:https://www.cnblogs.com/tongyishu/p/13208490.html
Copyright © 2011-2022 走看看