美文网首页
C++ “让new操作符不分配内存,只调用构造函数”

C++ “让new操作符不分配内存,只调用构造函数”

作者: 微糖去冰_ | 来源:发表于2019-10-06 10:03 被阅读0次

    问题

    c++中的new操作符 通常完成两个工作 分配内存及调用相应的构造函数。
    请问:
    1)如何让new操作符不分配内存,只调用构造函数?
    2)这样的用法有什么用?

    placement new的含义

    placement new可以实现不分配内存,只调用构造函数。

    void *operator new( size_t, void *p ) throw()     { return p; }
    

    placement new的执行忽略了size_t参数,只返还第二个参数。
    其结果是允许用户把一个对象放到一个特定的地方,达到调用构造函数的效果。

    用法如下:
    #include <iostream>
    #include <new>
    
    class Test
    {
    public:
        Test()
        {
            std::cout << "Constructor" << std::endl;
        };
        ~Test()
        {
            std::cout << "Destructor" << std::endl;
        }
    private:
        char mA;
        char mB;
    };
    
    char* gMemoryCache = (char *)malloc(sizeof(Test));
    
    int main()
    {
        {
            Test* test = new(gMemoryCache) Test();
        }
        {
            Test* test = new(gMemoryCache) Test();
            test->~Test();
        }
    }
    输出:
    Constructor
    Constructor
    Destructor
    
    和其他普通的new不同的是,它在括号里多了另外一个参数。比如:
    Widget * p = new Widget; - - - - - - - - - //ordinary new 
    pi = new (ptr) int; pi = new (ptr) int;     //placement new
    

    括号里的参数ptr是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。
    Placement new的返回值是这 个被构造对象的地址(比如括号中的传递参数)。

    placement new主要适用于:在对时间要求非常高的应用程序中,因为这些程序分配的时间是确定 的;长时间运行而不被打断的程序;以及执行一个垃圾收集器 (garbage collector)。

    相关文章

      网友评论

          本文标题:C++ “让new操作符不分配内存,只调用构造函数”

          本文链接:https://www.haomeiwen.com/subject/ldshyctx.html