いくつかのコンパイラは C++ の拡張機能をサポートしており、スタックにメモリを動的に割り当てることができます。たとえば、VLA と同様にg++
サポートします。alloca()
これらの拡張機能にはすべて、動的に割り当てられたメモリが呼び出し元の関数のスコープの最後で "割り当て解除" されるという注意事項があります。(編集:明確にするために、「割り当て解除」を引用符で囲みます。実際に起こっているのは、コンパイラがスタックポインターをデクリメント/インクリメントしているため、alloca()
コンパイラのサポートが必要な理由です。)これはalloca()
、クラスのコンストラクター内で割り当てられたメモリが割り当て解除されることを意味します。コンストラクターが戻るとすぐに。
この制限は、コンストラクターが割り当てるメモリの量を決定するためにいくつかの重要な手順を実行するクラスで対処するのが非常に困難になります。クラスのユーザーは、クラスの構築元の関数にメモリを割り当てる必要があります。これにより、おそらく公開すべきではない内部構造が公開されます。さらに、コードalloca()
や VLA を使用できるようにするための回避策をコードに入れることは、一般的に不便です。
alloca()
、VLA、またはその他の言語拡張機能を使用して、クラス内でメモリを割り当て、クラス スコープを持つことができるように、この制限を回避する方法を考えてもらえますか?