2017-10-02 8 views
1

だから私は.hファイルの初期化と同じコンストラクタで動的メモリを割り当てる

private: 
    eventlist *pointer; 
    int counter; 
    int size; 

と、この構造体型

struct eventlist// Define our struct type 
{ 
char name[100]; 
char todo[100]; 
char where[100]; 
char when[100]; 
char attended[100]; 
char excitement[100]; 
}; 

にクラスのこれらのプライベートデータメンバーを持っていると仮定すると私はしたいです構造体の動的配列を作成します。ここで私は主に好奇心程度だ...私はコンストラクタとして持っているもの

summerlist::summerlist() 
{ 
size = 0;// Initialize size to zero 
counter = 0;//Initialize counter to zero 
pointer = new eventlist[size]; 

    strcpy(pointer[0].name,"\0"); 
    strcpy(pointer[0].todo,"\0"); 
    strcpy(pointer[0].where,"\0"); 
    strcpy(pointer[0].when,"\0"); 
    strcpy(pointer[0].attended,"\0"); 
    strcpy(pointer[0].excitement,"\0"); 


    } 

です:

  1. は、それは私のコンストラクタで構造体の私の配列を割り当てても大丈夫ですか?それは何か問題を引き起こすことができますか?
  2. NULLへのポインタを初期化する前に配列を割り当てても構いませんか?私はそれがダイナミック配列へのポインタとして初期化されているので、それは大きな問題ではないと仮定しています。しかし、私はそれが受け入れられる練習であるかどうかを知りたい。
  3. 私がやったように配列の最初の要素を初期化するのは意味がありますか?私はメモリが配列(基底)の少なくとも1つの要素に割り当てられているので、最初の要素を初期化するのがよい方法だと思ったが、私が正しく可視化しているかどうかはまだ少し不安です。
  4. 最後に、動的配列を作成してポインタをNULLに設定すると、メモリリークが発生し、最初の要素が正しく初期化されませんでしたか?
+1

FWIWでは、実際には 'std :: string'と適切なスマートポインタを使用するべきです。 –

+0

'size == 0'の' pointer = new eventlist [size]; 'について確かめていますか? –

答えて

2
  1. はい、これは実際には、コンストラクタに割り当て、デストラクタで削除、結構ですが、あなたが達成することを目指すべきですRAIIタイプの始まりです。
  2. あなたは単純に何らかのメモリにポインタを割り当てているだけで、ポインタが何を保持していても問題はありません。
  3. これは、アプリケーションによって異なります。
  4. はい、そうです。作成したメモリはdeleteにする必要があります。あなたのクラスのデストラクタにお勧めします。 new[]delete[]を合わせることを忘れないでください。

最後の注意として、このタイプのコードは学習には適していますが、c++では実装には問題があります。何らかの形のメモリ制限(ダイナミックストアド構造の大きなセットを作成して以来、はっきりしていない)を持たない場合は、std::vectorのような組み込みのC++タイプを使用して動的配列を置き換える必要があります。 charアレイを置き換えるにはstd::string

struct eventlist { 
    std::string name; 
    ... 
} 

class summerlist { 

public: 
    summerlist(); 

private: 
    std::vector<eventlist> pointer; 
    int counter; 
} 

summerlist::summerlist() 
{ 
    counter = 0;// Initialize the counter to zero 
} 

これは、使用と制御が非常に簡単です。そして、これをやっている間違いを避けてください:pointer = new eventlist[size];ここで、sizeは0です。これは頭痛を軽減するはずです。

+0

ありがとうございます。私はクラスを取っているインストラクターは、C + +の両方のベクトルと文字列の大きな嫌いです。彼女は4コースのイントロC++を教えていますし、私たちがシーケンスを終えるまで、どちらかを使用することはできません。私はシーケンスの第2脚にいる。 –

+2

@LucAux C++では、組み込みアプリケーションや非常に高速なループなどの利点があるようなプログラミングが可能です。しかし、アプリケーションレベルのプログラミングに使用する場合は、機能と安全性の面ではるかに優れているため、これらのタイプを常に使用するようにしてください。 –

関連する問題