在存储块本身开始时,我需要存储一个对象,该对象描述由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分配指向该对象的指针? 谢谢。
答案 0 :(得分:1)
不允许我使用新的展示位置
“新放置”是将对象放置在现有内存块中的唯一方法。
[intro.object] ,当隐式更改联合的活动成员或创建临时对象时,将通过定义,new-expression创建对象。
剩下的唯一方法是使用新表达式,其中只有new放置可以引用现有的内存块。
因此,就C ++标准而言,您很不走运。
但是malloc
也存在相同的问题。那里有大量使用malloc
的代码,而无需使用new放置。这样的代码只是将malloc
的结果强制转换为目标类型,然后从那里开始。此方法在实践中有效,并且没有任何被破坏的迹象。
metaData *det = static_cast<metaData *>(alloc);
在不相关的注释上,metaData det();
声明了一个函数,而sizeof
不适用于函数。