0

2 次元ポインター bool** マトリックスを持つ Matrix というクラスがあります。

このコードを見てください:

void Matrix::operator=(const Matrix& A){ 

    cout << "address in A : " << A.matrix << endl ;
    cout << "address in y : " << matrix << endl ;

    //return *this;
}

次のようにメイン関数で = 演算子を呼び出しました。

Matrix x(3,5);
Matrix y(3,5);

x.set(1,4,1);
cout << "address out X: " << x.matrix << endl;
cout << "address out Y: " << y.matrix << endl;
y = x;
cout << "address out X: " << x.matrix << endl;
cout << "address out Y: " << y.matrix << endl;

デストラクタは次のようになります。

Matrix::~Matrix(){
    cout << "address de : " << matrix <<endl;
    for (int i=0;i<m;i++)
        delete[] matrix[i];
    delete[] matrix;
    cout << "address de finish : " << matrix <<endl;
}

Xcodeでプログラムを実行すると、次のようになります:

address out X: 0x100103ab0
address out Y: 0x100103af0
address in A : 0x100103ab0
address in y : 0x100103af0
address out X: 0x100103ab0
address out Y: 0x100103af0
address de : 0x100103af0
address de finish : 0x100103af0
address de : 0x100103ab0
address de finish : 0x100103ab0

見た目は問題ありませんが、=演算子関数を次のように変更すると:

Matrix Matrix::operator=(const Matrix& A){

    cout << "address in A : " << A.matrix << endl ;
    cout << "address in y : " << matrix << endl ;

    return *this;
}

結果としてこれを取得します:

address out X: 0x100103ab0
address out Y: 0x100103af0
address in A : 0x100103ab0
address in y : 0x100103af0
address de : 0x100103af0
address de finish : 0x100103af0
address out X: 0x100103ab0
address out Y: 0x100103af0
address de : 0x100103af0
Thesis(26190) malloc: *** error for object 0x100103b10: pointer being freed was not allocated

後者のコードでデストラクタがより早くトリガーされる理由を誰かに説明できますか?! どうすればそれを防ぐことができますか

前もって感謝します

4

2 に答える 2

4

代入演算子は*this値によって返され、そのコピーを作成しています。通常、参照を返します。

Matrix& Matrix::operator=(const Matrix& A)
//    ^

コピーは、暗黙的なコピー コンストラクターを使用して作成されます。これは、メンバー ポインターを単純にコピーします。これで、割り当てられたメモリを「所有」していると考える 2 つのオブジェクトができました。によって返される一時的な値operator=はすぐに破棄され、メモリが削除されy、ダングリング ポインターが残されます。y同じメモリをもう一度削除しようとすると、エラーが発生します。

これが、リソースを管理するクラスが 3 つのルールに従って、コピーしても安全であることを保証する必要がある理由です。などの標準コンテナはこれをstd::vector行います。通常は、メモリを自分で管理するよりも、これらを使用することをお勧めします。

于 2013-07-24T15:21:54.180 に答える