Если вы никогда не добавляете конструктор / деструктор, операторы присваивания или виртуальные функции в вашу структуру, используя malloc / free для выделения, безопасно.
Он не одобряется в кругах c ++, но я считаю, что его можно использовать, если вы документируете его в коде.
Некоторые комментарии к вашему коду:
struct Packet
{
unsigned int bitlength;
unsigned int data[];
};
Если я правильно помню, объявление массива без длины является нестандартным. Это работает на большинстве компиляторов, но может дать вам предупреждение. Если вы хотите быть совместимым, объявите ваш массив длины 1.
Packet* CreatePacket(unsigned int length)
{
Packet *output = (Packet*) malloc((length+1)*sizeof(unsigned int));
output->bitlength = length;
return output;
}
Это работает, но вы не учитываете размер структуры. Код сломается, как только вы добавите новых членов в свою структуру. Лучше сделать это так:
Packet* CreatePacket(unsigned int length)
{
size_t s = sizeof (Packed) - sizeof (Packed.data);
Packet *output = (Packet*) malloc(s + length * sizeof(unsigned int));
output->bitlength = length;
return output;
}
И напишите в своем определении структуры пакета комментарий, что данные должны быть последними.
Кстати, выделение структуры и данных с помощью одного распределения - это хорошо. Таким образом, вы вдвое сокращаете количество размещений и улучшаете локальность данных. Это может немного улучшить производительность, если вы выделите много пакетов.
К сожалению, c ++ не предоставляет хороший механизм для этого, поэтому вы часто сталкиваетесь с такими взломами malloc / free в реальных приложениях.