2016-12-13 6 views
0

Class.h:クラスatributeにコンストラクタで作成されたアイテムのポインタを割り当て

class Main_manager 
{ 
    public: 
     Main_manager(); 
     ~Main_manager(); 
     Field_manager* field_manag; 
    } 
} 

クラスのコンストラクタ:

Main_manager::Main_manager() { 
    Field_manager* field_manager = new Field_manager; 
    this->field_manager = field_manager; 
} 

私はthis-> field_manager = field_managerはへのポインタを維持するだろうと思いましたMain_managerクラスの属性としてちょうど作成されたfield_managerオブジェクトを使用していますので、そのメソッドを使用することができます。

私はそれが動作しない

Main_manager::function() { 
    this->field.manager->function_call(); 
    //trying to call field.manager's method as i should have its pointer 
} 

を呼び出そう。メモリを読み取ることができないためにアプリケーションが中断します。

this>field.manager = field_managerはおそらく動作しません。コンストラクタが終了すると、Main_managerfield_managerのメモリを読み取ることができません。 私はfield_managerのポインタをクラス属性として保持すれば、すべてうまくいくと思いました。

+0

「Field_manager * field_manager = new Field_manager;」は次のようになります。例外または 'nullptr'を生成しますか? –

答えて

1

私はあなたがこれらを行う必要はありませんthis-> field_manager = field_managerがポインタ

を維持するだろうと考えた:

Field_manager* field_manager = new Field_manager; 
this->field_manager = field_manager; 

代わりにコンストラクタで、単にあなたのポインタを割り当てますメンバーは直接:

field_manager = new Field_manager; 
+1

なぜ単純に 'Field_manager field_manager? 'その場合の' new'の利点は何ですか? –

+0

ありがとうございます。 私はそこに描かれているこの問題では、これらのアイテムは全て、拘束者が終わった後に破壊されました。 – sadboy

+0

いいえ、クラスメンバと同じ名前を持つコンストラクタ内のポインタだけが破棄されました。割り当てられたメモリは割り当てられたままで、Field_managerオブジェクトはまだ到達できませんが、まだアクセス可能です。あなたにはメモリリークがあります。クラスメンバのポインタは決して初期化されず(nullptrにさえも)、ゴミを含んでいません。それを省略すると、定義されていない動作になります。これらの問題を回避する方法の良いアイデアを得るには、用語RAII、メンバーの初期化リスト、スマートポインタと3のルール/ 5のルールを参照してください。 – mars

関連する問題