1

次のコードがあるとします。

class MyClass {
public:
    MyClass(int foo) : foo(foo){}

private:
    int foo;

//overloaded operator +
public:
    MyClass operator+(MyClass &mc){
        MyClass c(mc.foo + foo);
        return c;
    }
};

int main(int argc, char* argv[]){
    MyClass c1(10);
    MyClass c2(12);

    c2 = c1 + c2;

    return EXIT_SUCCESS;
}

演算子 + は、オブジェクトを変更せずに新しいオブジェクトを作成して返すようにオーバーロードされています。

c2 = c1 + c2呼び出されるc2と、新しいオブジェクトにバインドされますが、以前にバインドされたオブジェクトc2は解放されません (または、少なくとも私にはそう思われます)。私はそうですよね?

C++ にはガベージ コレクターがないため、これは問題になりますか?

何か不足していますか?

4

2 に答える 2

3

オブジェクトはローカルです。(new または malloc を使用して) メモリが動的に割り当てられている場合にのみ、メモリを明示的に解放することについて心配する必要があります。ローカル変数は、スコープ外になると破棄されます。

于 2012-05-02T18:43:17.977 に答える
1

c2 = c1 + c2 が呼び出されると、c2 は新しいオブジェクトにバインドされますが、c2 にバインドされた前のオブジェクトは解放されません (または、少なくとも私にはそう思われます)。

いいえ、そうではありません。

「」でバインドされた前のオブジェクトはありませんc2c2オブジェクトへの参照ではなく、オブジェクトです。c2の有効期間は、宣言された時点で始まり、範囲外になると終了します。

代入演算子は再バインドせずc2(意味c2がありません -- Java スタイルの参照ではありません!)、それに代入します。具体的には、c2.operator=(MyClass)orを呼び出しますc2.operator=(const MyClass&)c2代入前に存在し、代入後も同じオブジェクトが存在し続けます。

于 2012-05-02T19:24:26.033 に答える