目录
  • 1.new操作符
  • 2.::operator new
    • 2.1原始调用
    • 2.2重载1
    • 2.3重载2
  • 3.place new

    1.new操作符

    new operator,平时用的最多的new操作符,其对应delete operator,不能被重载,其包含两个操作(既申请空间,又调用构造函数)

    • (1)使用::operator new申请内存
    • (2)调用类的构造函数
    class CTestUse
    {
    public:
        CTestUse() { cout << __FUNCTION__ << endl; }
        virtual ~CTestUse() { cout << __FUNCTION__ << endl; }
     
    private:
    };
     
    void test()
    {
        string *pStr = new string("new operator");
        cout << *pStr << endl;
        delete pStr;
     
        CTestUse *pCase = new CTestUse;
        delete pCase;
    }
     
     
    int main(int argc, char *argv[])
    {
        test();
     
        return 0;
    }

    运行结果如下:

    分享C++三种类型new类型的运算符使用详情

    2.::operator new

    ::operator new,只会申请空间,不会调用构造函数,可以被重载,其对应 ::operator delete (只申请空间)

    2.1原始调用

    class CTestUse1
    {
    public:
        CTestUse1() { cout << __FUNCTION__ << endl; }
        virtual ~CTestUse1() { cout << __FUNCTION__ << endl; }
        void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
     
    private:
    };
     
     
    void test1()
    {
        CTestUse1 *pCase = (CTestUse1 *)::operator new (sizeof(CTestUse1));
        pCase->show();
        ::operator delete(pCase);
     
    }
     
    int main(int argc, char *argv[])
    {
        test1();
     
        return 0;
    }

    运行结果如下:

    分享C++三种类型new类型的运算符使用详情

    2.2重载1

    class CTestUse2
    {
    public:
        CTestUse2() { cout << __FUNCTION__ << endl; }
        virtual ~CTestUse2() { cout << __FUNCTION__ << endl; }
        void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
     
        void* operator new(size_t size) {
            cout << __FUNCTION__ << endl;
            return ::operator new(size);
        }
     
        void operator delete(void* ptr) {
            cout << __FUNCTION__ << endl;
            ::operator delete(ptr);
        }
     
    private:
    };
     
    void test2()
    {
        CTestUse2 *pCase = new CTestUse2;
        pCase->show();
        delete pCase;
     
    }
     
    int main(int argc, char *argv[])
    {
        test2();
     
        return 0;
    }

    运行结果如下:

    分享C++三种类型new类型的运算符使用详情

    2.3重载2

    class CTestUse3
    {
    public:
        CTestUse3() { cout << __FUNCTION__ << endl; }
        virtual ~CTestUse3() { cout << __FUNCTION__ << endl; }
        void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
     
        void* operator new(size_t size, string str) {
            cout << __FUNCTION__ << str << endl;
            return ::operator new(size);
        }
     
        void operator delete(void* ptr) {
            cout << __FUNCTION__ << endl;
            ::operator delete(ptr);
        }
     
    private:
    };
     
    void test3()
    {
        CTestUse3 *pCase = new ("heshiyang") CTestUse3;
        pCase->show();
        delete pCase;
     
    }
     
    int main(int argc, char *argv[])
    {
        test3();
     
        return 0;
    }

    运行结果如下:

    分享C++三种类型new类型的运算符使用详情

    3.place new

    place new在已经构建好的内存中创建对象,其只会返回已经申请好的内存指针,多用在高性能场景下,提前申请好内存,可以节省申请内存开消 (只调用构造函数)

    class CTestUse4
    {
    public:
        CTestUse4() { cout << __FUNCTION__ << endl; }
        virtual ~CTestUse4() { cout << __FUNCTION__ << endl; }
        void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
     
        void* operator new(size_t size, void* p) {
            cout << __FUNCTION__ << endl;
            return p;
        }
     
        void operator delete(void* ptr) {
            cout << __FUNCTION__ << endl;
            ::operator delete(ptr);
        }
     
    private:
    };
     
    void test4()
    {
        char* pChar = new char[sizeof(CTestUse4)];
        CTestUse4* pCase = new (pChar) CTestUse4; //调用全局::new (pChar) CTestUse4,new (pChar) CTestUse4调用重载new
        //delete pCase;
        pCase->~CTestUse4();
    }
     
    int main(int argc, char *argv[])
    {
        test4();
     
        return 0;
    }

    运行结果如下:

    分享C++三种类型new类型的运算符使用详情

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。