3

次のような構造体があるとします。

struct A{
 int someInt;
}

struct B : public A{
 int someInt;
 int someOtherInt;
}

そしてクラス:

class C{
 A *someAs;
 void myFunc(A *someMoreAs){
  delete [] someMoreAs;
 }
}

これは問題を引き起こしますか:

B *b=new B[10];
C c;
c.myFunc(b);

b を削除しているので、小さい方のタイプ A だと思います。これにより、メモリリークが発生しますか?

また、myFunc 内で b と同じものを new を使用してより多く割り当てたいとしますが、C は b が A であるか B であるかを知りません。友人が typeof を提案しましたが、VC はこれをサポートしていないようです。

4

1 に答える 1

4

この特定のケースでは、A と B の両方が POD (プレーン オールド データ) であり、その内容を破棄する必要がないため、メモリ リークは発生しません。

それでも、継承元となる (基本) クラスに常に仮想デストラクタを配置することをお勧めします。に仮想デストラクタを追加するとA、削除によってA*適切な派生デストラクタも呼び出されます (派生クラスのメンバーの破棄を含む)。

virtual ~A() {}

ただし、オブジェクトの実際のサイズが異なる可能性があるため、基本型の配列では継承を使用できないことに注意してください。

本当に必要なのは、おそらく基本クラスへのポインターの配列です。

std::vector<A*> someAs;

または、Boost に相当するもの (自動メモリ管理と優れた API を使用):

boost::ptr_vector<A> someAs;
于 2010-02-18T21:52:12.290 に答える