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
原文地址:https://www.cnblogs.com/tongyishu/p/13208490.html