問題
c++中的new操作符 通常完成兩個工作 分配內(nèi)存及調(diào)用相應(yīng)的構(gòu)造函數(shù)厢漩。
請問:
1)如何讓new操作符不分配內(nèi)存膜眠,只調(diào)用構(gòu)造函數(shù)?
2)這樣的用法有什么用溜嗜?
placement new的含義
placement new可以實(shí)現(xiàn)不分配內(nèi)存宵膨,只調(diào)用構(gòu)造函數(shù)。
void *operator new( size_t, void *p ) throw() { return p; }
placement new的執(zhí)行忽略了size_t參數(shù)炸宵,只返還第二個參數(shù)辟躏。
其結(jié)果是允許用戶把一個對象放到一個特定的地方,達(dá)到調(diào)用構(gòu)造函數(shù)的效果土全。
用法如下:
#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不同的是捎琐,它在括號里多了另外一個參數(shù)。比如:
Widget * p = new Widget; - - - - - - - - - //ordinary new
pi = new (ptr) int; pi = new (ptr) int; //placement new
括號里的參數(shù)ptr是一個指針涯曲,它指向一個內(nèi)存緩沖器野哭,placement new將在這個緩沖器上分配一個對象。
Placement new的返回值是這 個被構(gòu)造對象的地址(比如括號中的傳遞參數(shù))幻件。
placement new主要適用于:在對時間要求非常高的應(yīng)用程序中拨黔,因?yàn)檫@些程序分配的時間是確定 的;長時間運(yùn)行而不被打斷的程序绰沥;以及執(zhí)行一個垃圾收集器 (garbage collector)篱蝇。