2017-03-09 47 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

相关问题