2016-05-10 7 views
3

これは私のコースから割り当てられたもので、後ろの推論を理解するのが苦労しています。ベクター内のオブジェクト用であればデストラクタは呼び出されますか?

我々は次のように何のポインタとクラスの車を持っていないクラスPersonあります

class Car{ 
public: 
    //stuff 
private: 
    Person* owner; 
}; 

し、次のような関数:

機能が終了し
void f() { 
    vector<Car> v; 
    // do stuff with the vector 
} 

を、そこをコースの教材では、ベクトルの各Carを調べ、関数f()の最後にオーナーポインタを削除することを推奨します。メモリリークを防ぐために所有者を削除するCarのデストラクタを書くだけでは不十分ですか?

~Car() { 
    delete owner; 
} 
+7

短い答え:はい。 – StoryTeller

+0

回答ありがとうございます! – osk

+4

もう少し複雑です。デストラクタを定義する必要がある場合は、他の[メンバ関数](http://en.cppreference.com/w/cpp/language/rule_of_three)にも注意する必要があります。 – StoryTeller

答えて

6

いいえ、それは確かに十分ではありません。単にCarクラスでこれを追加することで

。あなたのクラスは5のルールに正しく従っていますか?私。コピーコンストラクタ、アサインメント演算子、コンストラクタの移動、およびアサーションの移動を正しく定義または削除していますか?あなたは本当に自分でこのポインタを管理する準備ができていますか?

私には2つの解決策があります。

  1. ポインタをまったく使用しないでください。コードからPersonのオブジェクトではなくPersonへのポインタが必要な理由が明確ではありません。 Personのメンバーにポリモーフィックに電話していますか?あなたがする必要がある場合を除いて、非ポインタを使用してください。
  2. ポインタが必要な場合は、それ自身を管理するポインタを使用します。 std::unique_ptrが最初に停止する必要があります。共有所有権が必要な場合は、std::shared_ptrを使用してください。
関連する問題