suchen

Heim  >  Fragen und Antworten  >  Hauptteil

c++ - Was ist die spezifische Implementierung dieser durch die Bibliothek reservierten Platzierung?

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

Ich bin darauf gestoßen, als ich verschiedene Formen von Operatoren neu gelernt habe (der C++-Primer hat nicht viel erklärt), aber ich konnte die Rolle dieser Funktion nicht verstehen, z. B. wie man diesen Funktionsaufruf zur Implementierung verwendet placement new的构造效果, 比如这样two *abc = new(m) two(10);(Obwohl ich diese Struktur gesehen habe Tatsächlich wird die obige Funktion auch aufgerufen. Das Testbeispiel lautet wie folgt (das Problem wurde kommentiert):

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

Hier werde ich das Problem weiter vereinfachen und detailliert beschreiben:

  1. Warum diese Funktion den Konstruktionseffekt erzielen kann, ist two *abc = new(m) two(10);为例, 我没有(或者说不知道怎么在step into进去)能看清具体实现, 虽然我知道抽象出来就是实现了就地构造了two(10)dieses Objekt.

  2. Was ist, wenn ich main()函数注释处这样直接调用函数的做法来实现就地构造, 我该如何修改参数和传入参数实现 two *abc = new(m) two(10); verwende, um den gleichen Effekt zu erzielen?

PS:

怪我咯怪我咯2792 Tage vor838

Antworte allen(1)Ich werde antworten

  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:32:16

    /q/10... @felix 大湿 已经在这个问题里给出解答了, 才看到. 我再琢磨和搜下相关内容

    Antwort
    0
  • StornierenAntwort