• 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
  • 相关阅读:
    git stash回退
    基于git tag快速修复
    Go语言开发规范
    defer实现原理
    string数据结构
    关于const iota
    struct
    map数据结构底层详解
    go 函数进阶
    go 内存分配原理
  • 原文地址:https://www.cnblogs.com/tongyishu/p/13208490.html
Copyright © 2020-2023  润新知