2016-11-30 5 views
0

ベクトルの宣言と初期化は、クラスPixelOperatorという名前のフィールドとして行う必要があります。クラスフィールドはC++でどのように宣言されるべきですか?

私は「スタック上に」最初は「ヒープ上」であるこれらの二つの宣言方法、および第二の間で引き裂かれています(あるいは、少なくとも、それが私の解釈です)。

  1. vector<int>* field = new vector<int>();
  2. vector<int> field = vector<int>();

私はスタイル番号1で宣言することを選択した場合、私はクラスのデストラクタで削除呼び出す必要があります。

1は、私が選択する必要があり

、なぜ?

また、クラスがヒープ上で初期化されている場合(つまり、PixelOperator* op = new PixelOperator();)、ヒープ上で初期化されたスタックでフィールドが初期化されますか?

答えて

2

あなたの直感は、このインスタンスでは間違っています。アプローチ(2)は必ずしもベクトルを積み重ねるとは限りません。 PixelOperatorオブジェクトが局所的に宣言されてスタックに置かれると、ベクトルも同様にに置かれますが、PixelOperatorオブジェクトがnew演算子を使用してヒープに置かれると、そのオブジェクトはそのオブジェクトの一部としてヒープに入れられます。この場合の違いは、アプローチ(2)では、ベクトルが他のオブジェクトフィールドと共に連続したメモリブロックの一部であり、アプローチ(1)では、オブジェクトを含むメモリブロックが別のブロックのアドレスこのベクトルには、ベクトルが含まれています。もちろん、アプローチ(1)では、PixelOperatorオブジェクトがヒープ上に置かれるかスタック上に置かれるかにかかわらず、ベクトルはヒープ上に終了します。アプローチ(2)は、オブジェクトがどこに割り当てられるかを決定する透明性を高めることができるので、一般に望ましいです。

3

方法2を選択します。オブジェクトをスタックに配置しますが、ベクターの実装ではコンテンツがヒープに配置される可能性が高くなります。

はまた、あなたが逆の意味を持ちます。 1はヒープ上、2はスタック上にあります。 1は削除が必要です。

+2

正しいのですが、方法2では、スタックにある(PixelOperator pix; ')、またはヒープ上にある可能性がある' PixelOperator'オブジェクトが置かれている場所にベクトルを置きます( 'PixelOperator * pix = new PixelOperator; –

1

つまずくことはありません。ヒープ上にstd::vector<>(またはその他の標準コンテナ)を割り当てる理由は決してありません。単に決してこれをしないとあなたは大丈夫です。

関連する問題