代码之家  ›  专栏  ›  技术社区  ›  alexgolec

如何使对象在内存中的特定位置构造自身[[副本]

  •  3
  • alexgolec  · 技术社区  · 14 年前

    可能重复:
    Create new C++ object at specific memory address?

    现在我的问题是:一旦我在我的池中得到一个指针,我如何在那里构造一个对象?

    4 回复  |  直到 7 年前
        1
  •  10
  •   Peter Ruderman    14 年前

    你使用新的布局。像这样:

    new( pointer ) MyClass();
    
        2
  •  3
  •   Loki Astari    14 年前

    使用新位置。

    std::vector<char> memory(sizeof(Myclass));    
    void*             place = &memory[0];          
    
    Myclass* f = new(place) Myclass();
    

    不要使用FAQ定义的方法:

    char     memory[sizeof(Myclass)];  // No alignment guarantees on this.
    

    返回的指针应适当对齐,以便可以转换为具有基本对齐要求(3.11)的任何完整对象类型的指针,然后用于访问分配的存储中的对象或数组(直到通过调用相应的释放函数显式释放存储)。

    3.11对齐[基本对齐]

    别忘了手动调用析构函数:

    f->~Myclass()
    
        3
  •  2
  •   Community Egal    7 年前

    新的安置可能会有所帮助。

    What uses are there for "placement new"?

        4
  •  0
  •   Prasoon Saurav    14 年前

    使用 placement new

    char memory[sizeof(Myclass)];    
    void* place = memory;          
    
    Myclass* f = new(place) Myclass();   
    

    记得

    您还应全权负责销毁放置的对象。这是由 调用析构函数:

     f->~Myclass();
    

    编辑

    在阅读了martinyork的评论和标准的相关部分之后,可以肯定的是,您不应该使用上面的方法(使用放置在堆栈上的具有新位置的对象)。使用 std::vector 取而代之的是 placement new 正如马丁所建议的。