• <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

            這個kisser不太冷
            posts - 100, comments - 102, trackbacks - 0, articles - 0

            placement new 操作符

            Posted on 2007-04-06 10:23 kk 閱讀(3275) 評論(1)  編輯 收藏 引用 所屬分類: IT

            在處理內存分配的時候,C++程序員會用new操作符(operator new)來分配內存,并用delete操作符(operator delete)來釋放內存。這是一個new操作符的例子。

            class CTest
            {
                 
            /* 成員函數和成員數據 */
            };

            // . . . 代碼

            //
            分配一個對象
            CTest * pTest = new Test;
            // 分配一個有十個對象的數組 (CTest 要有缺省構造函數(default constuctor)
            CTest * p10Tests = new Test[ 10];

            雖然這種寫法在大多數時候都工作得很好,但還是有些情況下使用new是很煩人的,比如當你想重新分配一個數組或者當你想在預分配的內存上構造一個對象的時候。

            比如第一種情況,重新分配一個數組效率是很低的:

            // 分配一個有10個對象的數組
            CTest * pTests = new Test[ 10];
            // . . .
            //
            假設現在我們需要11個對象
            CTest * pNewTests = new Test[ 11];
            // . . . 我們必須把原來的對象拷貝到新分配的內存中
            for ( int i = 0; i < 10; i++)
                pNewTests[ i] = pTests[ i];
            delete pTests;
            pTests = pNewTests;

            如果你想在預分配的內存上創建對象,用缺省的new操作符是行不通的。要解決這個問題,你可以用placement new構造。它允許你構造一個新對象到預分配的內存上:

            // buffer 是一個void指針 (void *)
            //
            用方括號[] 括起來的部分是可選的
            [CYourClass * pValue = ] new( buffer) CYourClass[( parameters)];

            下面是一些例子:

            #include <new>

            class CTest
            {
            public:
                CTest()
                {}
                CTest( int)
                {}
                
            /* 代碼*/
            };

            int main(int argc, char* argv[])
            {

                //
            由于這個例子的目的,我們不考慮內存對齊問題
                char strBuff[ sizeof( CTest) * 10 + 100];
                CTest * pBuffer = ( CTest *)strBuff;

                
            // 缺省構造
                CTest * pFirst = new(pBuffer) CTest;

                
            // 缺省構造
                CTest * pSecond = new(pBuffer + 1) CTest;
                
                
            // 帶參數的構造;
                //
            不理會返回的指針
                new(pBuffer + 2) CTest( 5);

                
            // 帶參數的構造
                CTest * pFourth = new( pBuffer + 3) CTest( 10);

                
            // 缺省構造
                CTest * pFifth = new(pBuffer + 4) CTest();

                
            // 構造多個元素(缺省構造)
                CTest * pMultipleElements = new(pBuffer + 5) CTest[ 5];
                return 0;
            }

            當你有自己的內存緩沖區或者在你實現自己的內存分配策略的時候,placement new會很有用。事實上在STL中廣泛使用了placement new來給容器分配內存;每個容器類都有一個模版參數說明了構造/析構對象時所用的分配器(allocator)。

            在使用placement new的時候,你要記住以下幾點:

            • 加上頭文件#include <new>
            • 你可以用placement new構造一個數組中的元素。
            • 要析構一個用placement new分配的對象,你應該手工調用析構函數(并不存在一個“placement delete”)。它的語法如下:

            pFirst->~CTest();
            pSecond->~CTest();
            //  . . . 等等

             

            Google

            Feedback

            # re: placement new 操作符  回復  更多評論   

            2012-09-20 10:59 by 會飛的兔子
            不錯,正好在找這個
            久久亚洲AV成人无码| 人妻精品久久久久中文字幕一冢本 | 一本色道久久88—综合亚洲精品 | 久久精品嫩草影院| 久久久久人妻一区精品| 精品无码久久久久国产动漫3d | 亚洲成av人片不卡无码久久 | 青青青国产精品国产精品久久久久| 91精品国产9l久久久久| 久久精品国产一区二区三区| 久久精品国产AV一区二区三区| 久久91精品国产91久久小草| 国内精品久久久久久久coent| 久久久黄色大片| 久久久精品午夜免费不卡| 亚洲欧美成人久久综合中文网 | 久久99精品久久久久久秒播| 亚洲va久久久噜噜噜久久天堂| 国产精品成人无码久久久久久| 久久国产欧美日韩精品免费| 国内精品久久久久影院一蜜桃| 欧美午夜A∨大片久久| 精品久久香蕉国产线看观看亚洲| 亚洲国产小视频精品久久久三级 | 色婷婷综合久久久久中文一区二区| 成人精品一区二区久久久| 久久精品成人欧美大片| 久久亚洲av无码精品浪潮| 狠狠色丁香久久综合五月| 久久天天躁狠狠躁夜夜躁2014| 精品久久久久久99人妻| 色综合久久88色综合天天| 精品久久久久久成人AV| 人妻精品久久无码专区精东影业| 国产精品久久久久a影院| 亚洲国产成人久久综合区| 国内精品免费久久影院| 一本大道久久a久久精品综合| 久久综合九色综合欧美狠狠| 青青草国产精品久久| 伊人久久综合热线大杳蕉下载|