0

私が考えているのはA、 SetVar によって返される右辺値が同一のコピーでClassあり、同じポインターを共有していることVarです。しかし、右辺値がそのデコンストラクターを呼び出すと、ClassVal.

class A
{
private:
    int* Var;
public:
    A SetVar(int);
    ~A()
    {
        delete Var;
    }
};

A A::SetVar(int NewVar)
{
    Var=new int;
    *Var=NewVar;
                //POINT A
    return *this;
}

int main()
{
    A Class;
    Class.SetVar(8);

                //POINT B
}

atPOINT A *Valは 8 に等しいが、 atは にPOINT B *Val等しい-17891602。2回削除しようとしたため、_BLOCK_TYPE_IS_VALID(pHead->nHeadUse)も取得Valします。

デコンストラクターを削除すると問題は解決しますが、メモリ リークが発生します。

4

2 に答える 2

6

あなたは3 つのルールに違反しました

したがって、オブジェクトのコピーを作成するときに

return *this

これも破棄さdeleteれ、同じポインターで 2 回呼び出されます。とにかく、これを行うべきではありません。参照を返す必要がありますが、セッター関数が呼び出されたオブジェクトへの参照を返す必要があるのはなぜですか? 関数呼び出しをチェーンすることですか?

Varさらに、再割り当てするたびにリークしています。

于 2012-06-30T02:26:32.723 に答える
1

ここにはいくつかの問題があります。

まず、問題の最も直接的な原因は、SetVar() が戻るときにオブジェクトのコピーが作成されることですthisクラス A にはコピー コンストラクターが定義されていないため、すべてのフィールドの値が暗黙的にコピーされます。これは、コピーが、SetVar で割り当てた同じ Var int へのポインターを持つことを意味します。言い換えると、同じメモリへの 2 つのポインターがあり、1 つは元の A 変数 (「クラス」と呼ぶもの) にあり、もう 1 つは SetVar() によって返されるコピーにあります。これらの 2 番目が破棄されると、そのデストラクタは、既に削除されたポインターでメモリを削除します。

于 2012-06-30T02:26:44.223 に答える