0

私の問題を説明するために、ソースを最小化します。

#include <iostream>
class vec{
    public:
    float* X;
    int DIM;
    vec(int dimension)
    {
        DIM = dimension;
        X = new float[dimension];
        for (int i=0;i<DIM;i++)
            X[i] = (float) rand()/RAND_MAX;
    }
    ~vec(void){
        delete [] X;
    }

    vec operator-( vec const& rhs )
    {
        vec ans(DIM);
        for (int i=0;i<DIM;i++)
            ans.X[i] = X[i] - rhs.X[i];
        return ans;
    }
};

int main(){
    vec A(5),B(5),C(5);
    C= A-B;
    return 0;
}

このプログラムを実行すると、ヒープが破棄されたというエラーが表示されます。デストラクタが私の問題であると確信しています。C= A-B;変数のある行ではans、コンストラクターによって破棄され、返すことができません。そうですか?行を削除すると、delete [] X;すべて問題ありません。しかし、それはメモリを解放しません。

私は宿題をして、この問題について最も有名な検索エンジンの 1 つに相談しましたが、答えが見つかりませんでした。どうすれば修正できますか?

4

1 に答える 1

4

C = A-Bデフォルトのコピー代入演算子を呼び出します(定義していないため)。したがって、2 つの異なるオブジェクトは、動的に割り当てられた同じ配列を指します。

3 つのルールを読む必要があります(簡単に言えば、デストラクタ、コピー コンストラクタ、またはコピー代入演算子のいずれかを定義する場合は、おそらくそれらすべてを定義する必要があります)。

ただし、生の配列を完全に使用することは避けるべきです。独自のメモリを管理するコンテナ タイプを使用します。

于 2013-03-29T11:03:08.730 に答える