• 5993阅读
  • 6回复

[提问]为什么这个简单的例子,点击关闭的时候,程序会崩溃? [复制链接]

上一主题 下一主题
离线tthheedhz
 
只看楼主 倒序阅读 楼主  发表于: 2012-05-09

#include <QtGui>

int main(int argc,char*argv[])
{
    QApplication app(argc,argv);

    QWidget w1;
    w1.setFixedSize(100,100);
    w1.setStyleSheet("QWidget{background:yellow;}");

    QWidget w2;
    w2.resize(200,200);
    w2.setStyleSheet("QWidget{background:blue;}");

    QBoxLayout* layout=new QBoxLayout(QBoxLayout::TopToBottom,&w2);
    layout->addWidget(&w1);

    w2.show();

    return app.exec();
}

离线dbzhang800

只看该作者 1楼 发表于: 2012-05-09
离线tthheedhz
只看该作者 2楼 发表于: 2012-05-09
引用第1楼dbzhang800于2012-05-09 08:47发表的  :
先去看这个吧:
http://blog.csdn.net/dbzhang800/article/details/6300025




看了你的帖子,根据你帖子的意思 ,你认为w2是先被析构的,为什么?
离线tthheedhz
只看该作者 3楼 发表于: 2012-05-09
到底,w1和w2的析构的顺序,是什么决定的?
离线dbzhang800

只看该作者 4楼 发表于: 2012-05-09
引用第3楼tthheedhz于2012-05-09 09:13发表的  :
到底,w1和w2的析构的顺序,是什么决定的?

呵呵,很不错的问题。其实我这个顺序我并不确认,也不清楚C++标准中有没有相应的条文。


不过倒是可以看看网路上的讨论,比如:


http://stackoverflow.com/questions/5257768/local-variables-construction-and-destruction-with-optimizer-involved
离线xuweistudy
只看该作者 5楼 发表于: 2012-05-09
这个例子很经典!!!
局部变量的析构顺序:先析构了w2,再析构w1

这里对于QObject的子类,有个原则:
你的如下2句
QBoxLayout* layout=new QBoxLayout(QBoxLayout::TopToBottom,&w2);
  layout->addWidget(&w1);
使得w2成为我w1的父类

在析构w2的时候会先找w2的孩子,所以w1被先析构了,之后再析构w2

这里是w2析构引起w1被析构了,但是作为局部变量的w1任然要再次被析构

简单的 说是由于w1被析构2次导致的中断

离线dbzhang800

只看该作者 6楼 发表于: 2012-05-09
引用第5楼xuweistudy于2012-05-09 10:41发表的  :
这里是w2析构引起w1被析构了,但是作为局部变量的w1任然要再次被析构
简单的 说是由于w1被析构2次导致的中断
.......


其实,崩溃出现在你这儿提到的w1第一次析构之时


当试图对栈空间进行delete时,程序就崩溃了。
快速回复
限100 字节
 
上一个 下一个