-1

最近、デストラクタがないためにいくつかのエラー (bad_alloc) が発生しました。

現在、次のように設定された2つのクラスがあります。

class ObjOne {
friend class ObjTwo;
public:                  //constructors and some other random methods
    ObjOne(int n) {
    }

    ObjOne() {
    }

private:
    int currSize;
    int size;
    int *jon;
};


 class ObjTwo {
 public:                       //constructors and some other methods
     ObjTwo(ObjOne, int n) {}  //
     ObjTwo() {}
     ObjTwo(const ObjTwo &source) {    //copy constructor
        num = source.num;
        x = source.x;
        myObjOne=source.myObjOne;
     }
     ~ObjTwo() {                          //destructor
           delete #
           delete &x;
           delete &myObjOne;
      }


private:
    ObjOne myObjOne;
    int num, x;
};

ここに ObjTwo の operator= があります

ObjTwo& ObjTwo::operator=(const ObjTwo& other) {
    num = source.num;
    x = source.x;
    myObjOne=source.myObjOne;
    return *this;
}

まず、私の仮定は次のとおりです(間違っている場合は修正してください):

ObjOne はデストラクタを必要としません。これはプリミティブ型のみであり、コンパイラがデフォルトのデストラクタを使用してクリーンアップする場合です。ObjTwo DOES には ObjOne が含まれているため、デストラクタが必要です。 ObjTwo デストラクタは、x、num、および myObjOne からメモリの割り当てを解除する必要があります。

これを使ってデストラクタをいくつか試してみましたが、依然として bad_alloc エラー (巨大なループなどでテストする場合) またはその他のエラー (現在のエラーでは、デストラクタが呼び出されるとクラッシュするだけ) に遭遇します。

私が間違っていることについてのガイダンスをいただければ幸いです

編集:これを単にループに入れると、bad_alloc例外がスローされます:

ObjTwo b(//some parameters);
ObjTwo a(//some parameters);
for (int i=0; i<20000000; i+) {
    bool x = (a == b);
}

これはオーバーロードされた == 演算子です

bool ObjTwo::operator==(const ObjTwo& other) {

ObjTwo temp = other;

for(int i=myObjOne.x; i>=0; i--) {
    if(myObjOne.get(i)!=temp.myObjOne.get(i)) {
        return false;
    }
}
return true;
}

エラーを読んだ後、メモリ不足が原因であると思われました。私の機能していないデストラクタが引き起こすでしょう。ここで何が問題になる可能性がありますか?

get メソッドは単純に jon[i]; を返します。

4

2 に答える 2

2

を使用する必要はありませんdelete。以前に で割り当てたもののみ を使用する必要があります。deletenew

ではObjTwo、メンバーmyObjOnenum、およびxは絶対にdeleted にしないでください。実際、メンバーのアドレスとdeleteそれを決して取得しないでください。メンバーは、メンバーであるオブジェクトが破棄されると自動的に破棄されます。

たとえば、次のように定義されたメンバーがあるとします。

int* p;

これpは へのポインタintです。ポインター自体は、その一部であるオブジェクトが破棄されると破棄されます。ただし、コンストラクターで次のintようにオブジェクトを動的に割り当てると想像してください。

p = new int();

ここで、オブジェクトを動的に割り当てるため、 が指すオブジェクトnewが必要になります。を使用してデストラクタでこれを行う必要があります。これは destroyingではなく、それが指摘するオブジェクトを破棄していることに注意してください。はメンバーであるため、手動で破棄しないでください。deletepdelete p;pp

于 2013-03-29T20:48:33.527 に答える
1

ObjOneデストラクタが必要な場合があります。これはプリミティブ型に関するものではなく、動的に割り当てられたメモリ (ポインター) などに関するものです。int*動的に割り当てられるか、少なくとも動的メモリへのポインターであるメンバーがあります。deleteしたがって、これでorを使用する必要がありますdelete[]
あなたがしていること~ObjectTwoは致命的です!スタックからメモリを削除しようとしています->未定義の動作ですが、ほとんどがクラッシュします。すべてのオブジェクト/変数はスタックに割り当てられているため、削除しないでください...

于 2013-03-29T20:50:06.750 に答える