1

したがって、文字の配列を宣言したい場合は、この方法で行うことができます

char a[2];
char * a ;
char * a = new char[2];

最初の宣言を無視して、他の2つはポインターを使用します。私の知る限り、3番目の宣言はヒープに格納され、delete演算子を使用して解放されます。2番目の宣言も配列をヒープに保持しますか?何かがヒープに格納されていて解放されていない場合、ファイルリンケージを持つ変数のように、ファイル内のどこでも使用できるということですか?ある関数で3番目と2番目の宣言の両方を試し、次に別の関数で変数を使用しようとしましたが、機能しませんでした。なぜですか?2番目と3番目の宣言の間に他の違いはありますか?

4

1 に答える 1

4
  • 最初のケースでa[2]は、スタックに2文字を格納します。
  • 2番目のケースでは、割り当てはまったくありません-初期化されaていないポインタです。
  • 3番目のケースでは、2つの文字がヒープに割り当てられます。

ヒープに割り当てられた変数はプロセス全体で共有できると考えるのは正しいですが、割り当てられたヒープメモリの場所を確実に渡す必要があります。これaは、メソッドや関数から戻るか、増やすことによって行います。aたとえば、クラススコープへのスコープ。

deleteヒープ割り当てを解放します。あなたの場合、deleteシナリオ3でのみ使用する必要があります。これは、#1では、スタック変数がスコープ外になるとクリーンアップされ、#2ではメモリが割り当てられていないためです。

上記は、ヒープ割り当てを介した所有権の譲渡中に混乱を引き起こしやすいため、auto_ptrまたはboostのshared_ptrなどのスマートポインターを使用して、作業を簡素化できます。

于 2012-11-25T08:54:11.313 に答える