c++ - 這個reserved by library的placement的具體實作是什麼呢?
怪我咯
怪我咯 2017-05-16 13:30:16
0
1
785
    #define __PLACEMENT_NEW_INLINE
    _Ret_notnull_ _Post_writable_byte_size_(_Size)
    inline void* __CRTDECL operator new(size_t _Size, _Writable_bytes_(_Size) void* _Where) throw()
    {
        (void)_Size;
        return _Where;
    }

學operator new的各類形式時遇到它(c++ primer 也沒有做出多少解釋), 但是看不明白這個函數的作用, 例如應該如何用這個函數呼叫來實現出placement new的建構效果, 例如這樣two *abc = new(m) two(10);(雖然我看了這樣構造其實也是呼叫了上面的那個函數), 和. 測試用例如下(問題之處已註):

// test_.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

class one
{
public:
    int x;
    int y = 0;
};

class two
{
public: 
    static int p;
    two(int a_) : a{a_} {}
    two()
    {
        a = 2;
        b = 3;
    }
private:
    class one o;
    int a;
    int b = 1;
};

int two::p = 66;

int main()
{
    void *m = ::operator new(20, std::nothrow);
    two *www = NULL;
    ::operator new(100, www); //注释处是本提问的问题所在, 也是上面那个代码的入口
    new(www) two;
    decltype(auto) x = two::p;
    two *abc = new(m) two(10);
    int df = 1;
    _CrtDumpMemoryLeaks();
    return 0;
}

這裡我把問題進一步簡化、細緻:

  1. 這個函數為什麼能實現構造的效果, 已 two *abc = new(m) two(10);為例, 我沒有(或說不知道怎麼在step into進去)能看清具體實作, 雖然我知道抽像出來就是實現了就地構造了two(10)這個物件.

  2. #如果用main()函數註解處這樣直接呼叫函數的做法來實現就地構造, 我該如何修改參數和傳入參數實現 two *abc = new (m) two(10);一樣的效果?

#附註:

  • 我一開始的一個猜想是傳入的_Where指標應該是已經建構好的物件的指標, 但是這樣實作的話需要已經有一個物件, 與placement new應該是違背的.

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(1)
伊谢尔伦

/q/10... @felix 大濕 已經在這個問題裡給出解答了, 才看到. 我再琢磨和搜下相關內容

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!