美文网首页
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