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
  • 相关阅读:
    opencv检测运动物体的基础_特征提取
    混合高斯建模
    计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接
    opencv视频读取问题
    混合高斯模型背景显示
    图像显著区域检测代码及其效果图 saliency region detection
    opencv宏
    目标检测与转自背景减除
    混合高斯模型不显示背景
    error C3872: “0x3000”: 此字符不允许在标识符中使用错误 的解决办法
  • 原文地址:https://www.cnblogs.com/tongyishu/p/13208490.html
Copyright © 2011-2022 走看看