Posted on 2007-04-06 10:23
kk 閱讀(3268)
評(píng)論(1) 編輯 收藏 引用 所屬分類:
IT
在處理內(nèi)存分配的時(shí)候,C++程序員會(huì)用new操作符(operator new)來分配內(nèi)存,并用delete操作符(operator delete)來釋放內(nèi)存。這是一個(gè)new操作符的例子。
class CTest
{
/* 成員函數(shù)和成員數(shù)據(jù) */
};
// . . . 代碼
// 分配一個(gè)對(duì)象
CTest * pTest = new Test;
// 分配一個(gè)有十個(gè)對(duì)象的數(shù)組 (CTest 要有缺省構(gòu)造函數(shù)(default constuctor))
CTest * p10Tests = new Test[ 10];
雖然這種寫法在大多數(shù)時(shí)候都工作得很好,但還是有些情況下使用new是很煩人的,比如當(dāng)你想重新分配一個(gè)數(shù)組或者當(dāng)你想在預(yù)分配的內(nèi)存上構(gòu)造一個(gè)對(duì)象的時(shí)候。
比如第一種情況,重新分配一個(gè)數(shù)組效率是很低的:
// 分配一個(gè)有10個(gè)對(duì)象的數(shù)組
CTest * pTests = new Test[ 10];
// . . .
// 假設(shè)現(xiàn)在我們需要11個(gè)對(duì)象
CTest * pNewTests = new Test[ 11];
// . . . 我們必須把原來的對(duì)象拷貝到新分配的內(nèi)存中
for ( int i = 0; i < 10; i++)
pNewTests[ i] = pTests[ i];
delete pTests;
pTests = pNewTests;
如果你想在預(yù)分配的內(nèi)存上創(chuàng)建對(duì)象,用缺省的new操作符是行不通的。要解決這個(gè)問題,你可以用placement new構(gòu)造。它允許你構(gòu)造一個(gè)新對(duì)象到預(yù)分配的內(nèi)存上:
// buffer 是一個(gè)void指針 (void *)
// 用方括號(hào)[] 括起來的部分是可選的
[CYourClass * pValue = ] new( buffer) CYourClass[( parameters)];
下面是一些例子:
#include <new>
class CTest
{
public:
CTest()
{}
CTest( int)
{}
/* 代碼*/
};
int main(int argc, char* argv[])
{
// 由于這個(gè)例子的目的,我們不考慮內(nèi)存對(duì)齊問題
char strBuff[ sizeof( CTest) * 10 + 100];
CTest * pBuffer = ( CTest *)strBuff;
// 缺省構(gòu)造
CTest * pFirst = new(pBuffer) CTest;
// 缺省構(gòu)造
CTest * pSecond = new(pBuffer + 1) CTest;
// 帶參數(shù)的構(gòu)造;
// 不理會(huì)返回的指針
new(pBuffer + 2) CTest( 5);
// 帶參數(shù)的構(gòu)造
CTest * pFourth = new( pBuffer + 3) CTest( 10);
// 缺省構(gòu)造
CTest * pFifth = new(pBuffer + 4) CTest();
// 構(gòu)造多個(gè)元素(缺省構(gòu)造)
CTest * pMultipleElements = new(pBuffer + 5) CTest[ 5];
return 0;
}
當(dāng)你有自己的內(nèi)存緩沖區(qū)或者在你實(shí)現(xiàn)自己的內(nèi)存分配策略的時(shí)候,placement new會(huì)很有用。事實(shí)上在STL中廣泛使用了placement new來給容器分配內(nèi)存;每個(gè)容器類都有一個(gè)模版參數(shù)說明了構(gòu)造/析構(gòu)對(duì)象時(shí)所用的分配器(allocator)。
在使用placement new的時(shí)候,你要記住以下幾點(diǎn):
- 加上頭文件#include <new>
- 你可以用placement new構(gòu)造一個(gè)數(shù)組中的元素。
- 要析構(gòu)一個(gè)用placement new分配的對(duì)象,你應(yīng)該手工調(diào)用析構(gòu)函數(shù)(并不存在一個(gè)“placement delete”)。它的語法如下:
pFirst->~CTest();
pSecond->~CTest();
// . . . 等等