c++ - Apakah pelaksanaan khusus ini yang dikhaskan oleh penempatan perpustakaan?
怪我咯
怪我咯 2017-05-16 13:30:16
0
1
795
    #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;
    }

Saya menemuinya apabila mempelajari pelbagai bentuk operator baharu (primer c++ tidak banyak menerangkan), tetapi saya tidak dapat memahami peranan fungsi ini, seperti cara menggunakan panggilan fungsi ini untuk melaksanakan placement new的构造效果, 比如这样two *abc = new(m) two(10);(Walaupun saya melihat struktur ini Malah, fungsi di atas juga dipanggil), dan Contoh ujian adalah seperti berikut (masalah telah diulas):

// 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;
}

Di sini saya akan memudahkan dan memperincikan lagi masalah:

  1. Mengapa fungsi ini boleh mencapai kesan pembinaan ialah two *abc = new(m) two(10);为例, 我没有(或者说不知道怎么在step into进去)能看清具体实现, 虽然我知道抽象出来就是实现了就地构造了two(10)objek ini.

  2. Bagaimana jika saya menggunakan main()函数注释处这样直接调用函数的做法来实现就地构造, 我该如何修改参数和传入参数实现 two *abc = new(m) two(10);untuk mendapatkan kesan yang sama?

PS:

  • Salah satu tekaan awal saya ialah _Where pointer pass in sepatutnya menjadi penunjuk kepada objek yang telah dibina, tetapi jika dilaksanakan dengan cara ini, sudah semestinya ada objek, yang sepatutnya bertentangan dengan placement new.

怪我咯
怪我咯

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

membalas semua(1)
伊谢尔伦

/q/10... @felix Dashi telah pun memberikan jawapan kepada soalan ini, saya baru melihatnya saya akan memikirkannya dan mencari kandungan yang berkaitan

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan