コンストラクター/デストラクタ、代入演算子または仮想関数を構造体に追加しない場合は、割り当てに 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 ハックに陥ることがよくあります。