【问题标题】:How can I make an object construct itself at a particular location in memory? [duplicate]如何使对象在内存中的特定位置自行构造? [复制]
【发布时间】:2011-03-16 09:38:50
【问题描述】:

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

我正在编写本质上是一个对象池分配器,它将分配一个类。我正在分配足够的内存来容纳我需要的对象,并且我正在传递指向内部空间的指针。

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

【问题讨论】:

    标签: c++ stl allocator


    【解决方案1】:

    您使用的是新展示位置。像这样:

    new( pointer ) MyClass();
    

    【讨论】:

    • 记得在释放内存之前调用析构函数。
    【解决方案2】:

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

    What uses are there for "placement new"?

    【讨论】:

      【解决方案3】:

      使用placement new

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

      记住

      您还应全权负责销毁放置的对象。这是通过显式调用析构函数来完成的:

       f->~Myclass();
      

      编辑

      在阅读了 Martin York 的评论和标准的相关部分之后,可以肯定的是,您不应该使用上述方法(使用放置在堆栈上的对象和放置 new)。按照 Martin 的建议,使用 std::vector 代替 placement new

      【讨论】:

      • 不要将堆栈/全局变量与放置 new 一起使用。该标准不保证堆栈/全局变量的对齐。因此,您应该使用动态分配的内存(因为标准确实提供了有关其对齐的受赠者)。所以最简单的方法是给我们一个向量(因为向量的数据部分是动态分配的)。
      • @Martin:谢谢,我不知道。 :)
      【解决方案4】:

      使用新的展示位置。

      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.
      

      如常见问题解答中所述,这是危险的,因为该标准没有提供有关此内存对齐的授权。使用标准向量确实可以保证对齐,因为向量的数据部分是动态分配的,并且标准确实提供了动态分配内存对齐的保证。

      来自:n2521(我桌面上的副本)部分:3.7.3.1

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

      这将我们指向 3.11

      3.11 对齐 [basic.align]
      5 阵营有从弱到强或更严格的排列顺序。更严格的对齐具有更大的对齐值。满足对齐要求的地址也满足任何较弱的有效对齐要求。

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

      f->~Myclass()
      

      【讨论】:

        猜你喜欢
        • 2019-01-18
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 2023-04-10
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多