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

2019-10-06  本文已影响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)。

上一篇下一篇

猜你喜欢

热点阅读