【发布时间】:2010-12-27 11:09:31
【问题描述】:
所以我有几个结构......
struct myBaseStruct
{
};
struct myDerivedStruct : public myBaseStruct
{
int a, b, c, d;
unsigned char* ident;
};
myDerivedStruct* pNewStruct;
...我想动态分配足够的空间,以便我可以在某些数据中“memcpy”,包括以零结尾的字符串。基本结构的大小显然是“1”(我假设它不能为零),派生的大小是 20,这似乎是有道理的 (5 x 4)。
所以,我有一个大小为 29 的数据缓冲区,前 16 个字节是整数,其余 13 个字节是字符串。
如何为 pNewStruct 分配足够的内存,以便有足够的空间用于字符串?理想情况下,我只想去:
- 在 pNewStruct 分配 29 个字节;
- memcpy 从缓冲区到 pNewStruct;
谢谢,
【问题讨论】:
-
好的,感谢您的反馈。我对 malloc 的想法很感兴趣,但我不熟悉范式,这表明这是一个坏主意?无论如何都叫我 n00b - 或者,对详细说明这一点的文档的一些参考会更有成效。
-
如果你想要一个连续的变长结构,你必须在最后放一个数组,而不是指针。
-
谢谢。是的,根据 Remus 的回答,这就是我所做的,结合使用 malloc,我已经让它工作了。为了澄清,派生结构的原因是我可以保留一个非特定类型的指针,然后将 memcpy 保存在一个循环中。该过程实际上执行以下操作: - 读取块类型字节。 - 读取块的大小。 - 将正确类型的成员变量分配给扩展大小。 - 使用本地基类指针指向成员变量。 - Memcpy 的指针大小。基于不知道接下来是什么块,这在循环上运行。
-
非常重要,除非您可以保证编译器将成员放置在目标结构和目标结构之间完全相同的位置,否则不要使用 memcpy。允许编译器在不通知用户的情况下在成员之间添加填充。最安全和最便携的方法是使用成员方式复制,通过复制构造函数或函数。
-
如果两个 POD 类以相同的顺序具有相同的数据成员,那么它们是“布局兼容的”(9.2/14)。虽然我找不到这样说的规范,但我很确定这意味着编译器必须将成员放在完全相同的位置,因此您可以从一个到另一个进行 memcpy。如果在这种情况下不是基类,那么具有问题中给出的成员的两个不同的类/结构将符合条件。问题是基类占用一些字节是合法的。
标签: c++ dynamic structure new-operator allocation