C++ 对象在从函数返回时被销毁

C++ 对象在从函数返回时被销毁,c++,qt,constructor,namespaces,C++,Qt,Constructor,Namespaces,我正在从事qt项目,并注意到我的应用程序崩溃。 调试时,我发现这是因为没有创建/初始化qpushbutton对象 现在我不明白为什么它没有被初始化 我在名称空间中编写了一个函数,它为所有Qpushbutton调用构造函数,我通过引用将对象传递给该函数 那么,一旦函数返回,它不应该保留它的值吗?但在我的例子中,函数一返回就被销毁了? 它与名称空间有关吗 任何帮助或批评都会有帮助吗 MY_Utility.h class MY_Utility { private: QPushB

我正在从事qt项目,并注意到我的应用程序崩溃。
调试时,我发现这是因为没有创建/初始化qpushbutton对象

现在我不明白为什么它没有被初始化

我在名称空间中编写了一个函数,它为所有Qpushbutton调用构造函数,我通过引用将对象传递给该函数 那么,一旦函数返回,它不应该保留它的值吗?但在我的例子中,函数一返回就被销毁了? 它与名称空间有关吗

任何帮助或批评都会有帮助吗

   MY_Utility.h
  class MY_Utility
  {

private:
    QPushButton* add_cal_button_; 
    QPushButton*  sub_cal_button_; 
    QPushButton*  mul_button_; 

  }
My_Utility.cpp

namespace
{
   void create_push_button_for_cal( QPushButton *button_cal, QString button_name, QGridLayout *grid, int grid_row, int grid_col )
    {
        button_cal = new QPushButton( button_name );

        if(!button_cal )
    {
        msg.setInformativeText("The code does not come here so object is created");
        QMessageBox msg;
        msg.setText("Messsage");
        msg.setInformativeText("OBject not initialised in create_push button  ");
        msg.exec();;
    }
        button_cal->setFixedSize( 200 , 40 );
        button_cal->setVisible( false );
        grid->addWidget(  button_cal, grid_row, grid_col );
    }


    // function where we call all button created
void create_main_view( MY_Utility* main_p, QTreeWidget* tree_p, QTableWidget* table_p, QPushButton* add_cal_button_,  
                                                                                                   QPushButton* sub_cal_cal_button_, 
                                                                                                   QPushButton* mul_cal_button_,

{
    QWidget*        center_p = new QWidget( main_p );
    QHBoxLayout*    layout_p = new QHBoxLayout( center_p );
    QGridLayout*    grid     = new QGridLayout( center_p );
    grid->setSpacing( 1 );

    create_push_button_for_cal( add_cal_button_, "addition_calculate" , grid, 1, 2 );
    if( !add_cal_button_ )
    {
        QMessageBox msg;
        msg.setText("Messsage");
        msg.setInformativeText("OBject not initialised in first part of message  why not ?? ");
        msg.exec();;
    }
    create_push_button_for_cal( sub_cal_cal_button_ ,"sub_Calculate",           grid, 2, 2 );
    create_push_button_for_cal( mul_cal_button_ ,    "multplication_Calculate", grid, 3, 2 );
    // Make the QWidget the central widget so we can resize within it
    main_p->setCentralWidget( center_p );
   bla .. 
   bla ..



}

}

My_Utility::set_all_cal_button_visible(){
 add_cal_button_->setVisible(true) ; // it crashes here 

}

<>你的问题是C++问题,不是QT问题。

void create_push_button_for_cal(QPushButton *button_cal, QString button_name)
{
    button_cal = new QPushButton(button_name);
    Q_ASSERT(button_cal);
}
指针(地址)按值传递。您的代码将丢弃此值,并用指向新实例的指针覆盖它

检查null
按钮\u cal
是没有用的,因为
new
有一个很好的不变量:如果它后面的代码执行了,就意味着它已经成功地分配了内存。它让生活变得非常简单:如果
new
返回一个值,就可以了。它不会返回无效或空值

如果
new
失败,则永远不会执行断言,事实上,
new
甚至不会返回值。它将抛出一个异常,当抛出该异常时,您所能做的很少,因为执行几乎任何操作都需要更多内存,我们刚刚用完:(

您需要更改函数的签名以返回指向新创建实例的指针。您还应该通过常量引用而不是值来传递Qt类。如果函数中的其他代码可能引发异常,请使用智能指针来保护您自己,以免泄漏button实例。因此:

QPushButton * create_push_button_for_cal(const QString & button_name) {
    QScopedPointer<QPushButton> btn(new QPushButton(button_name));
    ...
    // If any code here throws an exception, the scoped pointer will delete
    // the button instance, so that it won't leak.
    ...
    return btn.take();
}
QPushButton*为校准创建按钮(常量字符串和按钮名称){
QScopedPointer btn(新的QPushButton(按钮名称));
...
//如果此处的任何代码引发异常,则作用域指针将删除
//按钮实例,这样它就不会泄漏。
...
返回btn.take();
}

您对“未初始化”的假设很可能是错误的。它是对的,这表明存在一些更深层次的问题,如内存损坏。@阿尔夫,当我试图调用Qpushbutton时,在我的_实用程序的某个成员函数中说“添加_校准”按钮,它会崩溃。例如,我的_实用程序::设置所有的校准按钮可见(){添加\u校准按钮->设置可见(true);//在此处崩溃}或将其更改为空创建按钮(QPushButton*&button\u-cal,QString按钮名称)这将创建对指针的引用。@Sayutee是的,但这只是一种非常糟糕的风格,因为在逻辑上只有一个返回值,而传入值没有任何用处。最好不要教它。同意。很抱歉,我在发布之前没有过多考虑设计/风格:)@KubaOber,非常感谢,伙计,这非常有帮助,我从你那里学到了一些东西。你的详细解释非常好