9

クラスが次のように宣言されている場合:

class MyClass
{
  char * MyMember;
  MyClass()
  {
    MyMember = new char[250];
  }
  ~MyClass()
  {
    delete[] MyMember;
  }
};

そして、それは次のように行うことができます:

class MyClass
{
  char MyMember[250];
};

クラスはどのようにヒープに割り当てMyClass * Mine = new MyClass(); られますか? 割り当てられたメモリは、クラスのインスタンス化と共に 2 番目の例で 250 バイトも割り当てますか? また、メンバーは MyClass オブジェクトの存続期間全体にわたって有効ですか? 最初の例については、クラス メンバーをヒープに割り当てるのは実用的ですか?

4

3 に答える 3

7

はい、はい、そしてはい。

ただし、最初の例には少しバグがあります。つまり、データメンバーの1つがヒープに割り当てられたデータを持つポインターであるため、たとえばのように、コピーコンストラクターと代入演算子も宣言する必要があります。 ..

MyClass(const MyClass& rhs) 
{
  MyMember = new char[250]; 
  memcpy(MyMember, rhs.MyMember, 250);
}
于 2010-05-12T15:56:01.490 に答える
3

初期の注意:std::stringヒープに割り当てられたchar[]の代わりに使用してください。

割り当てられたメモリは、クラスのインスタンス化とともに2番目の例の250バイトも割り当てますか?

スタックに割り当てられたMyClassの場合と同じように、コンストラクターにヒープ割り当てされます。「一緒に」の意味によって異なりますが、必ずしも一緒に割り当てられるとは限りません。

また、メンバーはMyClassオブジェクトの存続期間全体にわたって有効ですか?

はい。

最初の例に関しては、クラスメンバーをヒープに割り当てるのは実用的ですか?

はい、場合によっては。ヘッダーファイルからのインクルードを最小限に抑えたい場合もあれば、ファクトリ関数を使用してメンバーを作成する場合もあります。しかし、通常、私は単純な非ポインターメンバーと一緒に行きます。

于 2010-05-12T15:55:52.807 に答える
1

呼び出すnewと、ヒープから割り当てられます。それ以外の場合は、スタックから割り当てられます(無視mallocします)。

最初の例では、MyClassのインスタンス用にスタックに4バイト(32ビットポインターを想定)、MyMemberに割り当てられたバッファー用にヒープに250バイトの両方にスペースが割り当てられます。

2番目の例では、MyClassのインスタンスのスタックに250バイトが割り当てられます。この場合、MyMemberはインスタンスへのオフセットとして扱われます。

于 2010-05-12T15:55:38.683 に答える