重要な理由は、スタックがどのように機能するかです。プッシュ操作とポップ操作しかありません。その後にプッシュされたものをすべて解放する前に、スタック内の何かを解放することはできません。または、別の言い方をすれば、関数が戻るときに関数呼び出しのスタック フレームなど、何かがスタックから解放された場合、スタック内のその上にあるすべてのメモリも解放されます (適切に破棄されることを確認することをお勧めします。以下を参照してください)。 )。
プログラムは通常、スタックとは別にデータを格納する必要があります。コンパイル時にstatic dataとしてメモリを割り当てる方法と、heap とも呼ばれるフリー ストアにメモリを割り当てる方法の 2 つがあります。
複数のスタックを持つことは確かに可能であり、実際、便利で便利な場合には、これも一般的に行われます。しかし、それは、 などのタイプのスタック コンテナ変数を使用して行われstd::stack
、それをデータ専用の追加スタックとして使用します。一般的なプロセッサ アーキテクチャには、プロセス/スレッドごとに「ネイティブ」スタックが 1 つだけあり、それが関数呼び出しとスタック変数に使用されます。これらの余分なスタックは常に分離され、プログラム コードによって作成されます。リストやマップなどと同じ単純なデータ構造です。
あなたの質問のコードについて、指摘すべき点は、現代の C++ ではnew
一般的にネイキッドは嫌われているということです。スマート ポインターなどの RAII メカニズムを使用する必要があります。
void fun()
{
auto a = std::unique_ptr<A>{ new A }; // C++11 syntax
// object is automatically destroyed when a goes out of scope, no leak
// note: heap should be used like this only if there's a reason, including:
// - A is big, and might conceivably overflow the stack
// - ownership of object may get moved and outlive the unique_ptr
}
そして、あなたの特定の質問「作成されたオブジェクトはフリーストアに存在し、main()関数では使用できません。なぜオブジェクトをフリーストアに作成する必要があるのか 」、まあ、質問コードでは作成しないでくださいフリーストアでは、理由はありません。スコープ外になると自動的に破棄される単純な自動変数でなければなりません。