我想为结构的某些元素分配内存,这些元素是指向其他小结构的指针。如何以最佳方式分配和取消分配内存?
例如:
typedef struct _SOME_STRUCT {
PDATATYPE1 PDatatype1;
PDATATYPE2 PDatatype2;
PDATATYPE3 PDatatype3;
.......
PDATATYPE12 PDatatype12;
} SOME_STRUCT, *PSOME_STRUCT;
我想为PDatatype1,3,4,6,7,9,11分配内存。我可以用单个malloc分配内存吗?或者只为这些元素分配内存以及如何释放分配的整个内存的最佳方法是什么?
答案 0 :(得分:1)
是一个允许单个malloc
的技巧,但这也必须权衡更多标准的多malloc
方法。
如果 [和仅 if],一旦分配了DatatypeN
的{{1}}元素,它们就不会需要以任何方式重新分配,任何其他代码也不会对其中的任何代码执行SOME_STRUCT
,您可以执行以下操作[假设free
指向{ {1}}]:
PDATATYPEn
然后,当你完成时,只需DATATYPEn
。
上面的PSOME_STRUCT
alloc_some_struct(void)
{
size_t siz;
void *vptr;
PSOME_STRUCT sptr;
// NOTE: this optimizes down to a single assignment
siz = 0;
siz += sizeof(DATATYPE1);
siz += sizeof(DATATYPE2);
siz += sizeof(DATATYPE3);
...
siz += sizeof(DATATYPE12);
sptr = malloc(sizeof(SOME_STRUCT) + siz);
vptr = sptr;
vptr += sizeof(SOME_STRUCT);
sptr->Pdatatype1 = vptr;
// either initialize the struct pointed to by sptr->Pdatatype1 here or
// caller should do it -- likewise for the others ...
vptr += sizeof(DATATYPE1);
sptr->Pdatatype2 = vptr;
vptr += sizeof(DATATYPE2);
sptr->Pdatatype3 = vptr;
vptr += sizeof(DATATYPE3);
...
sptr->Pdatatype12 = vptr;
vptr += sizeof(DATATYPE12);
return sptr;
}
应足以为子结构提供正确的对齐方式。如果没有,您必须使用提供必要对齐的宏(例如free(sptr)
)替换它们。 (例如)8字节对齐,类似于:
sizeof
注意:虽然可以做到这一切,但对于像变长字符串结构这样的事情更常见:
SIZEOF
它是否值得[潜在]脆弱性(即有人忘记并对个别元素进行#define SIZEOF(_siz) (((_siz) + 7) & ~0x07)
)值得商榷。更简洁的方法是嵌入实际的结构而不是指针,如果单struct mystring {
int my_strlen;
char my_strbuf[0];
};
struct mystring {
int my_strlen;
char *my_strbuf;
};
是您的高优先级。
否则,只需按[更多]标准方式执行12个单独的realloc/free
来电,然后进行12个malloc
来电。
仍然, 是一种可行的技术,特别是在小内存受限系统上。
以下是涉及每元素分配的[更多]常用方法:
malloc
答案 1 :(得分:0)
如果您的结构包含其他结构作为元素而不是指针,您可以一次性为组合结构分配内存:
typedef struct _SOME_STRUCT {
DATATYPE1 Datatype1;
DATATYPE2 Datatype2;
DATATYPE3 Datatype3;
.......
DATATYPE12 Datatype12;
} SOME_STRUCT, *PSOME_STRUCT;
PSOME_STRUCT p = (PSOME_STRUCT)malloc(sizeof(SOME_STRUCT));
// Or without malloc:
PSOME_STRUCT p = new SOME_STRUCT();