3

C++ で変数にストレージを割り当てることができるステートメントを特定しようとしていました。今まで、私は思いついた:

  1. 宣言ステートメント:int a;さまざまなストレージ、スコープ指定子 ( autostaticglobal) などのステートメント。
  2. 式ステートメント:ヒープ上のストレージは、など
    を使用して割り当てることができます。技術的には、のストレージはその宣言で割り当てられます。私はここでそのようなすべてのケースを数えています。 mallocnewpointer
    • 右側の代入 exprmalloc/new/callocまたは呼び出された関数がストレージを割り当てる可能性がある関数呼び出し。
    • 関数呼び出し expr。変数は参照によって渡され、呼び出された関数でストレージが割り当てられます。

他の方法は考えられませんが、もっと多くの方法があるのではないかと考えています。質問の言い回しが正しくないかもしれませんが、人々が私が求めていることを理解してくれることを願っています。:) 任意の入力を歓迎します。

4

1 に答える 1

5

最良の方法は、メモリのクラスごとに割り当てステートメントをグループ化することです。

  1. 静的
  2. スタック
  3. ヒープ
  4. 例外
  5. スレッド ローカル (C++11 のみ)

すべての静的割り当ては、宣言から取得されます。特に、クラス テンプレートのインスタンス化に注意してください。テンプレートの静的データ フィールドは 1 つの宣言として表示されますが、このテンプレートのインスタンス化と同じ数のデータ フィールドがデータ セグメントに生成されます。関数/メソッド内の静的オブジェクトには、 のようなグローバル名はありません::Namesp::Class1::Class2::Smth。クラスまたは名前空間の通常の静的オブジェクトには、常にそのような名前があります。

スタックの割り当ては、関数のローカル変数とパラメーターの宣言から行われます。何かが関数 (ref、ptr、val など) に渡された場合、動的に生成されたものではなく、パラメーターの宣言に従って作成されたものとして脅した方がよいでしょう。

それに加えて、式の計算中および関数/メソッドから何かが返されるときに存在する一時変数があります。それらはすべてスタック割り当てです。

ヒープ割り当ては常に明示的です。それらは、malloc (またはそのフレーバーの 1 つ)、new または new[] で作成されます。

throwステートメントと共に例外が割り当てられます。catchコントロールがブロックを出ると、それらは暗黙的に削除されます。何かがSome-Class*(つまり、ポインターとして) スローされた場合、C++ ランタイムはポインター自体を破棄するだけであることに注意してくださいno-op。この場合、catch ブロック内のユーザーのコードによってオブジェクトを削除する必要があります。それ以外の場合、これはバニラになりますmemory-leak/

スレッド ローカル オブジェクトの宣言方法は、静的オブジェクトと非常によく似ています。複数のコピーしかありません。

于 2012-10-14T06:28:05.120 に答える