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