在存储块的开头放置一个小对象

时间:2019-12-09 08:06:32

标签: object c++14

在存储块本身开始时,我需要存储一个对象,该对象描述由sbrk()分配的存储块的存储详细信息。 例如:

metaData det();
void* alloc = sbrk(sizeof(det)+50000);
//a code piece to locate det at the beggining of alocate.

不允许使用new放置,也不允许使用new / malloc等分配内存。 我知道,简单地将其分配给内存块将导致未定义的行为。 我当时正在考虑使用memcpy(我认为这可能会导致问题,因为det没有动态分配)。 是否可以在开始工作时(仅在没有其他选择的情况下)或memcpy分配指向该对象的指针? 谢谢。

1 个答案:

答案 0 :(得分:1)

  

不允许我使用新的展示位置

“新放置”是将对象放置在现有内存块中的唯一方法。

  

[intro.object] ,当隐式更改联合的活动成员或创建临时对象时,将通过定义,new-expression创建对象。

  • 您无法进行定义以引用现有的内存区域,因此就可以了。
  • 没有工会,所以也出来了。
  • 不能在现有的内存块中创建临时对象,所以这也就不可用了。

剩下的唯一方法是使用新表达式,其中只有new放置可以引用现有的内存块。

因此,就C ++标准而言,您很不走运。

但是malloc也存在相同的问题。那里有大量使用malloc的代码,而无需使用new放置。这样的代码只是将malloc的结果强制转换为目标类型,然后从那里开始。此方法在实践中有效,并且没有任何被破坏的迹象。

metaData *det = static_cast<metaData *>(alloc);

在不相关的注释上,metaData det();声明了一个函数,而sizeof不适用于函数。