2016-09-05 1 views
-1

ポインタメンバ変数を設定し、私は次のように簡略化されたクラスL持っている:正しく

Cが別のクラスである
class L 
{ 
    private: 
     C * _pc ; 
    public: 
     C * getc() const ; // getter 
     void setc(const C * ipc); //setter 
     ~L() 
     { 
      delete _pc ; 
     } 
}; 

を。

私はまた、次のように簡略化ヘルパークラスCHelperを持っている:

class CHelper 
{ 
    C _c ; 
    CHelper(L & ic) 
    { 
     // 1st constructs _c (code omitted); 
     // then sets ic's _pc pointer member variable : 
     ic.setc(&_c); 
    } 
}; 

私は確信してされることなく、何とか_pcの削除に問題があるだろうと感じています。それはどうですか?

このような承認の瑕疵は何ですか?正しいアプローチで同じ「機能」(ポインタメンバー変数を正しく設定する)にはどうすれば到達できますか?

+3

http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three –

+1

実際にあなたのアプローチに問題があります。まず、 'CHelper'オブジェクトが破壊されると、' _c'メンバも破壊されます。 '_pc'はガベージをポイントします。次に、 'delete _pc;'は同じオブジェクトに対して2回目の破壊を試みます。私はstdのスマートポインタを調べることをお勧めします。 –

+0

あなたの例はコンパイルされません。 'L'クラスの中で、デストラクタの名前は'〜C'です。それは動作しません。また、クラスの構築時に '_pc'をnullptrに初期化する必要があります。代わりに 'shared_ptr'や' unique_ptr'のようなスマートポインタを考えることもできます。 – Hayt

答えて

0

あなたのコードは現在コンパイルされません。 CHelperのコンストラクタはCオブジェクトを要求します。 Cクラス(おそらく)にはsetcメソッドがありません。おそらくCHelper(L& ic)を意味するでしょう。

とにかく、あなたのCHelperオブジェクトが範囲外になり、破壊された場合、メンバー変数_cはそれと共に破壊されます。あなたのLオブジェクトにぶら下がっているポインタを残す。それだけでなく、Lも現在3/5のルールに違反しています。

あなたがC++ 11へのアクセス権を持っている場合は、私は非常にCHelperクラスが必要な場合std::shared_ptrと生のポインタ_pc_cを交換することをお勧め(したがってそのデストラクタでdeleteの除去)し、そうでない場合はstd::unique_ptrでしょう。

+0

あなたはそうだった、私はコードを修正しました。 '_c'はポインタではありません –

+0

@ user10000100_uしかし共有されたptr管理のためにはそれが必要です。 –

-3

アレイにdelete [] _pcを使用する必要があるため、ipcパラメータが配列のように割り当てるかどうかを確認してください。