0
Mat::Mat(int R, int C)
{
    Ar = new int[C*R];
    Co = C;
    Ro = R;
}

Mat::~Mat()
{
    delete[] Ar;
}

それでも、この「削除」で「シグナルSIGABRT」を取得します。

編集:
私はXCODEを使用しています。また、ハードコピーコンストラクターを追加しようとしました。私はまだdelete []でこのエラーを受け取ります:

Mat::Mat(int R, int C)
{
    Ar = new int[C*R];
    Co = C;
    Ro = R;
}

Mat::Mat(const Mat& M): Co(M.Co), Ro(M.Ro)
{
    Ar = new int[M.Co*M.Ro];
    for (int i = 0; i<(M.Co*M.Ro); i++) {
        Ar[i] = M.Ar[i];
    }
}

Mat::~Mat()
{
    delete[] Ar;
}
4

2 に答える 2

6

これはより精神的なデバッグですが、根本的な原因であると私はかなり確信しています.3つのルールに
従うべきです. ポインターのディープ コピーを作成する クラスに は、独自のコピー コンストラクターコピー代入演算子を提供する必要があります。
Mat

上記の関数のカスタム バージョンがない場合Ar、クラス オブジェクトの一時コピーが作成および破棄されるたびに、ポインター メンバーに割り当てられた動的メモリの割り当てが解除さdelete []れます。その結果、未定義の動作とクラッシュが発生しました。

于 2012-06-07T09:11:52.490 に答える
1

コードのどこかに次のようなものがある場合:

{
Mat A(R1,C1);//create A.Ar
MAT B(A);//now B.Ar will point to A.Ar array
}//delete will be called twice for the same array
于 2012-06-07T09:21:34.860 に答える