2017-03-09 66 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(); 
} 

我知道這是不是最優雅的方式做的事情;我之所以這樣做;

  • MainWindow定義,我不能創建一個GraphWindow對象 因爲class GraphWindow向前聲明有
  • 我可以只使用指針「GraphPtr to access all its member functions in的MainWindow :: on_runButton_clicked()but I'm using this function called QTimer :: singleShot() in的MainWindow :: on_runButton_clicked()which requires a object of type GraphWindow`

無論如何,我想我通過存儲指針廣告accessi創建的對象的地址,這樣做的方式以後是正確的。但不知道爲什麼我的程序崩潰。任何意見讚賞。 。

+0

由於它是在堆棧上創建的,graphObj在on_runButtonClicked的端部破壞( ) –

+0

一旦指針超出範圍,指針將不會保持活動狀態。在'on_runButton_clicked()''graphObj'的末尾被銷燬。 'graphPtr'現在是一個懸掛指針。 在我看來,您需要在on_runBittonClicked中動態分配graphObj,然後在您使用它之後將其刪除。 –

回答

1

您正在存儲堆棧上局部變量的地址。 on_runButton_clicked函數返回時,該對象被破壞/釋放。這稱爲懸掛指針:訪問該指針的任何代碼稍後調用未定義的行爲。

一種解決方案:分配與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

相關問題