2012-03-31 10 views
1

C++では、クラスのメンバ、クラス、またはそのクラスのインスタンスの作成者を削除する責任がありますか?
たとえば、次のコードで:削除する責任があります

class B { 
    public: 
    B(int x) { num = x; } 
    int num; 
}; 

class A { 
    public: 
    A(B* o) { obj = o; } 
    B* obj; 
}; 

int main(void) { 
    A myA(new B(3)); 
    return 0; 
} 

mainBのインスタンスを削除する必要があり、またはAのデストラクタは、そのローカル変数objを削除する必要がありますか?ほとんどの場合、これは当てはまりますか?

+2

これはデストラクタの目的です。だから、質問に答えるために、クラス、デストラクターが呼び出されるとき。スマートポインタを使用する場合は、どちらも心配する必要はありません。 – chris

+1

これはあなたの設計上の選択です。強制的な唯一の規則はこれです:あなたのプログラムは、 'new'ごとに' delete'を呼び出さなければなりません。 –

答えて

3

これは所有権の基本的な問題です。 AにはBを所有する必要があります(Aが作成されたときに新しいBが作成され、Aが破壊されると破壊されるはずです)、通常はAがインスタンスを作成および破棄します。 B:このような場合には

class B { 
    int num; 
public: 
    B(int x) : num(x) {} 
}; 

class A { 
    B *obj; 
public: 
    A(int value) : obj(new B(value)) {} 
    ~A() { delete B; } 
}; 

が、しかし、チャンスはAが同じように書かれるべきであることはかなり良いです:

class A { 
    B obj; 
public: 
    A(int v) : obj(v) {} 
}; 

int main() { 
    A a(3); 
    return 0; 
} 

この方法は、Bのインスタンスが作成され、自動的に破棄、あなたの部分に全く介入することなく。

+0

3のルールを忘れないでください。 – chris

+0

@chris:yes - それを正しく実行した理由の一部であり、AのインスタンスをAで直接集約して完了させたものです。 –

+0

必要に応じてオーナーシップを移転できることも指摘しておきます。終わりには、プログラマーとして、誰が何を所有しているか、その所有権が人生のためであるかどうか、またはアプリケーションの状態に応じて所有権が移転されるかどうかを決定するのはあなた次第です。 –

1

ほとんどの場合、Aは、RAIIがベースにしているようにメンバーを管理する必要があります。可能であればunique_ptrを使用してください。

データが管理されていない場合は、異なるスマートポインタ、具体的にはshared_ptrを使用する必要があります。これにより、責任がshared_ptrに移されます。これは、バニラポインタよりもはるかにエラーが起こりにくいものです。

もちろん、ポインタを一切使用しないことが好ましい方法です。なぜあなたはnewを最初に呼びますか?

+1

なぜ私はこの質問をするために新しいものを呼びますか?私はjavaとCからC++に来ています。私はすべてを理解したいと思います。私はスマートポインタやRAIIについて聞いたことがありませんが、私はそれを見ていきます。ありがとう! – Robz

+0

@Robz - C++では、 'new'を呼び出すことはほとんどありません。 C++とJavaは*非常に*異なる言語です。 –

+0

@BoPersson、あなたはC++で何を書いていますか? :) –

関連する問題