【问题标题】:Recursive placement allocation递归布局分配
【发布时间】:2012-11-04 12:44:05
【问题描述】:

是否可以进行递归布局分配?
如果我有这个课程:

class A
{
private:
   int m_filed1;  
   char* m_field2;

public:
   A(int size)  
{  
  m_field1 = size;
  m_field2 = new char[size];
}

};

并且我想在特定缓冲区上动态分配它,我希望 m_field2 将在该缓冲区上分配太多,我将在“A”内定义的每个对象也是如此。
能做到吗?

【问题讨论】:

  • 你可以这样做,但我不推荐它
  • “A 内部”是指每个聚合对象吗?
  • @Pubby:为什么?如何? :)
  • @DougT.:是的,这就是我的意思。

标签: c++ placement-new


【解决方案1】:

您需要进行一些内存管理。首先,您需要将缓冲区处理程序传递给您的类构造函数。在构造函数中,您必须找到一个偏移量,您可以在其中存储动态分配的成员,最后您还需要对成员使用placement new。 像这样的:

class A
{
private:
   int m_filed1;  
   char* m_field2;
   char* m_field3;
public:
   A(int size, char *buffer)  
{  
  m_field1 = size;
  m_field2 = new (buffer + sizeof(A)) char[size];
  m_field3 = new (buffer + sizeof(A) + sizeof(m_field2)) char[size];
  //...
}

};

A* objA = new (mybuffer) A(size, mybuffer);调用

编辑:你可能没有将缓冲区传递给构造函数(虽然不确定,可能取决于编译器,需要检查):

class A
{
private:
   int m_filed1;  
   char* m_field2;
   char* m_field3;
public:
   A(int size)  
{  
  m_field1 = size;
  m_field2 = new ((char*)this + sizeof(A)) char[size];
  m_field3 = new ((char*)this + sizeof(A) + sizeof(m_field2)) char[size];
  //...
}

};

A* objA = new (mybuffer) A(size);调用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2021-07-12
    • 1970-01-01
    • 2013-05-20
    • 2016-01-04
    • 1970-01-01
    • 2020-10-30
    相关资源
    最近更新 更多