3

クラス内にクラスがあり、ネストされたクラス

class A {
 public:
 int a;
 int b;
  class B {
    int c;
    int d;
  }
}

その過程で、クラスBのオブジェクトポインタをヒープに割り当てます。

   B *bobj = new B();
   A *a;
   auto_ptr<A> A1(new A());
   a = A1.release();

aを削除bobjしますか?

delete a;

または、サブクラスポインタも明示的に削除する必要がありますか?

これは私が書いたものではないコードにあります。すべてのallocとdeallocにログを配置しましたがB *bobj = new B()、これには削除がなく、Aのオブジェクトptrには削除があることがわかります。それでもメモリリークはありません。そのため、このシナリオで何が起こるのか疑問に思いました。

4

4 に答える 4

9

ここで少し混乱していると思います。タイプのオブジェクトがある場合、その中にオブジェクトAはありませんB。2つintのsとがaありbます。クラスは、名前空間で宣言するのと同じように、B内部でネストされたクラスとして宣言されます。クラス外からA参照する必要があります(そうする必要があります)。A::Bpublic

提供したサンプルコードでは、オブジェクトB *bobj = new B(); A *a;を作成していません。A私はあなたがこれを意味したと思います(あなたが作ると仮定してB public):

A::B *bobj = new A::B();
A *a = new A();

aとはbobj完全に別個のオブジェクトです。彼らはお互いに何の関係もありません。あなたはdeleteそれらの両方をしなければなりません。

代わりにこれを行った場合:

class B {
  int c;
  int d;
};

class A {
  int a;
  B b;
};

これで、クラスタイプのオブジェクトには、タイプAがであるというメンバーbがありBます。そのbメンバーは、タイプのオブジェクトの一部ですA。したがって、そうすると、オブジェクトが内部にあるオブジェクトA* a = new A();が得られます。あなただけがしなければなりません。ABdelete a;

黄金律:deleteあなたがnew編集したものだけ。

于 2013-02-26T12:49:42.893 に答える
3

コードを記述した方法class Bは、内にネストされた型ですclass Aが、のインスタンスclass Bはに含まれていませclass Aん。つまり、インスタンス化、つまり破棄は個別に管理する必要があります。そうです、delete両方の場合はnew両方を行う必要があります。

于 2013-02-26T12:48:39.773 に答える
3

それはあなたのデストラクタが何をしているかによります。Aタイプのポインタが含まれ、このポインタBのデストラクタAが解放された場合-はい。Aタイプのポインタが含まれていない場合B、および/またはAのデストラクタポインタが解放されてBいない場合は、手動で解放する必要があります。

于 2013-02-26T12:49:34.340 に答える
2

つまり、C ++はオブジェクトポインタを自動的に削除しません(特殊な自動ポインタなどはありません)。したがって、プログラムでそれらを 明示的に削除してください。

delete a;Aクラスのデストラクタを呼び出します。デストラクタ内のBのオブジェクトを削除するコードを記述できます。

于 2013-02-26T12:48:32.923 に答える