• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Kisser Leon

            這個(gè)kisser不太冷
            posts - 100, comments - 102, trackbacks - 0, articles - 0

            placement new 操作符

            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();
            //  . . . 等等

             

            Google

            Feedback

            # re: placement new 操作符  回復(fù)  更多評(píng)論   

            2012-09-20 10:59 by 會(huì)飛的兔子
            不錯(cuò),正好在找這個(gè)
            亚洲精品无码久久久| 亚洲国产成人精品久久久国产成人一区二区三区综 | 日韩中文久久| 亚洲国产成人久久综合一| 伊人久久大香线蕉综合Av| 亚洲七七久久精品中文国产| 狠狠久久综合| 久久激情亚洲精品无码?V| 久久精品一区二区三区不卡| 色欲久久久天天天综合网| 久久久一本精品99久久精品88| 日韩美女18网站久久精品| 亚洲精品无码久久毛片| 久久久久久久久66精品片| 亚洲精品无码专区久久同性男| 三级韩国一区久久二区综合| 亚洲国产精品无码久久久久久曰| 欧美久久综合九色综合| 婷婷久久综合九色综合九七| 久久免费看黄a级毛片| 2021国产精品久久精品| 久久久SS麻豆欧美国产日韩| 久久99精品国产麻豆宅宅| 久久亚洲中文字幕精品有坂深雪 | 亚洲中文字幕无码久久综合网 | 97久久久久人妻精品专区 | 亚洲一本综合久久| 狠狠人妻久久久久久综合| 欧美午夜精品久久久久久浪潮| 久久精品国产欧美日韩99热| 狠狠色噜噜色狠狠狠综合久久| 无码精品久久久久久人妻中字| 91视频国产91久久久| 国产精品美女久久久久AV福利| 久久综合久久鬼色| 亚洲人成精品久久久久| 久久99国产精品久久99果冻传媒| 精品国产热久久久福利| 精品多毛少妇人妻AV免费久久 | 久久香蕉国产线看观看99| 久久久久综合国产欧美一区二区|