2017-02-13 41 views
0

この問題はすでに尋ねられていますが、この権利をどのように言いたいのか分かりません。 私は、Arduino Uno(2kbyte sram)以降、実際にメモリ効率が必要なアプリケーションを構築しています。必要なクラスオブジェクトの完全な配列を読み込むことができないので、部分的にロードすることにしました。 これは私がそれを行うことを計画する方法は基本的です:私は他の値に[0]オブジェクトを変更するときC++クラス配列のメモリ割り当ての再割り当て

//declare class object array 
MyClass objects[10]; 
objects[0] = MyClass(*parameters for initializing*); 
.... 
.... 
//Some code with objects 
//now changing the objects 
objects[0] = MyClass(*parameters for initializing*); 

今、私の質問は、最初のオブジェクトは、[0]メモリが解放されますか? 私が知る限り、オブジェクトは基本的にはクラスのフィールドへのポインタであり、コンストラクタを呼び出すとオブジェクトへの新しいポインタを取得するので、コード内で何をしているのかはオブジェクト[0]が指しているものを変更することです私はオブジェクト[0]メモリの値が最初に指摘されているかどうかは分かりませんが、メモリは解放されます。

+2

「オブジェクトが基本的にクラスのフィールドへのポインタであることを理解する限り、間違ったことを理解しています。オブジェクトは多くの点でCの構造体と同じです。 –

答えて

5

私の知る限りは、オブジェクトは基本的にクラスのフィールドへのポインタであることを理解してコンストラクタを呼び出すときに、オブジェクトへの新しいポインタ得るように。]

いいえ、C++でオブジェクトは...まあ、実際のオブジェクトです。 MyClass objects[10]は10個のサイドバイサイドで構成され、ポインタは関係しません。

objects[0] = MyClass(/* ... */);と書くと、新しいMyClassが作成され、配列の最初のMyClassに割り当て(コピー)された後、破棄されます。再び、ポインタは関与しません。

+0

私は正しく理解すれば、常に同じバイトのメモリを常に使用するでしょうか?実際には –

+0

@ S.Korai。 – Quentin

+0

ありがとう、今私は私のプロジェクトを進める方法を知っている –

1

私はオブジェクト[0]を別の値に変更すると最初のオブジェクト[0]メモリが解放されますか?

いいえアレイの有効期間中、10個のオブジェクトは同じです。オブジェクトは追加または削除されません。アレイの有効期間が始まると、すべてのオブジェクトのメモリ(割り当てられていないダイナミックメモリはカウントされません)が割り当てられ、アレイの有効期間が終了すると解放されます。

配列の1つのメンバーに割り当てると、コピー(または移動)代入演算子は配列内のオブジェクトの状態を変更します。コピー元の一時オブジェクトは、割り当ての最後に破棄されます。

は、私の知る限り理解したオブジェクトは、基本的に私には誤解を招くと思われるクラス

の分野へのポインタです。より良い類推は、オブジェクトがメモリブロックであり、メンバオブジェクトがそのメモリブロック内のサブオブジェクトであるということです。アレイと同様にメモリブロックであり、配列のメンバーはそのメモリブロック内のサブオブジェクトです。

ポインタの類推は、非プリミティブな変数が暗黙的にポインタであるJavaのようないくつかの言語では適切でしょう。しかし、ポインタが明示的でC++のような言語ではなく、値の意味が暗黙的に使用されます。

+0

あなたの答えをありがとう、私はOOPの知識の大部分がC#を学ぶことから来ているので頭の上に釘を打つと思います。 –