• 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
  • 相关阅读:
    蓝桥杯--2012--奇怪的比赛(全排列)
    mysql数据库读写分离教程
    Linux中安装java JDK
    mysql数据库主从复制教程
    mysql数据库安装教程
    http报文详解
    查看磁盘I/O命令iostat详解
    linux如何查看服务器当前的并发访问量
    Another app is currently holding the yum lock; waiting for it to exit...
    linux清理缓存cache
  • 原文地址:https://www.cnblogs.com/tongyishu/p/13208490.html
Copyright © 2020-2023  润新知