2017-03-09 1 views
-2

MainWindow::runButton_clicked()私はGraphWindowのオブジェクトをインスタンス化しました。 MainWindowの別の関数でこのオブジェクトにアクセスする必要があるので、オブジェクトのアドレスを同じ型のポインタに渡そうとしました。 MainWindow.hで同じタイプのポインタを使ってオブジェクトのアドレスを渡す

//Forward declaring Graphwindow 
class GraphWindow; 

class MainWindow : public QMainWindow 
{ 
    //Member slots 

    GraphWindow *graphPtr; 
} 

in MainWindow.cpp 

MainWindow::on_runButton_clicked() 
{ 
     GraphWindow graphObj; 
     MainWindow::graphPtr = &graphObj;   

     //Other code 
} 

MainWindow::someFunction() 
{ 
     MainWindow::graphPtr->exec(); 
} 

私は、これは物事を行うための最もエレガントな方法ではありません知っています。私がこれをやっている理由。

  • 私はclass GraphWindow以来MainWindow定義 にGraphWindowのオブジェクトを作成できません。そこは
  • 前方宣言されている私は、ポインタを使用することができます「GraphPtr to access all its member functions inメインウィンドウ:: on_runButton_clicked()but I'm using this function called QTimer :: SINGLESHOT() inメインウィンドウ:: on_runButton_clicked()which requires a object of type GraphWindow`

とにかく私は、ポインタの広告accessiで作成されたオブジェクトのアドレスを格納することによって行う方法を推測後で正しいです。しかし、なぜ私のプログラムがクラッシュするのか分かりません。何かアドバイスをいただきました。 。

+0

、graphObjは(on_runButtonClickedの終わりに破壊されます) –

+0

ポインタは、オブジェクトが有効範囲外になったらオブジェクトを生かしておくことはできません。 'on_runButton_clicked()'の最後に 'graphObj'が破壊されます。 'graphPtr'は今やぶら下がりポインタです。 graphObjをon_runBittonClickedに動的に割り当てて、使用した後にgraphObjを削除する必要があります。 –

答えて

1

ローカル変数のアドレスをスタックに格納しています。 on_runButton_clicked関数が返ってくると、そのGraphWindowオブジェクトは破棄または割り当て解除されます。これはというダングリングポインタと呼ばれ、後でそのポインタにアクセスして未定義のビヘイビアを呼び出します。

一つの解決策:newでヒープ上のオブジェクトを割り当てる(およびdeleteにそれを忘れないでください!):それはスタック上に作成されたよう

MainWindow::on_runButton_clicked() 
{ 
     GraphWindow* graphObj = new GraphWindow(); 
     MainWindow::graphPtr = graphObj;   

     // Other code 
} 

// whenever you're done with graphPtr: 
delete MainWindow::graphPtr; 
+0

感謝しています。ちょうどC + +を学び始めた。 – Vino

関連する問題