• 8207阅读
  • 13回复

请问一下,这样会内存泄露吗? [复制链接]

上一主题 下一主题
离线磐石
 
只看楼主 倒序阅读 楼主  发表于: 2010-03-23
假设有一个主对话框,上有一个按钮,每次点击时就打开另一个对话框,简化代码如下:

class myDialog::public QDialog
{
.............................
..........................
  public slots:
      void openDialog();
    ...............
   private:
       QPushButton *button;
       QDialog *dalog;
  ..................
}
........................
connect(button,SIGNAL(clicked()),this,SLOT(openDialog()));
...............................

void myDialog::openDialog
{
   dialog=new QDialog;
    dialog->show();
      //delete dialog;         我的问题是,这里需要加这句吗,每次我打开新的对话框时,完成所需任务,最后关闭这新的对话框,程序有没有把这句(dialog=new QDialog;)申请的内存释放掉,如果没有的话,那么多次点击button后就会内存泄露了;但如果加了这句,新对话框就一闪而过
}
不怕做不到,只怕想不到
离线drylake
只看该作者 1楼 发表于: 2010-03-23
首先,我觉得会产生内存泄漏。
Qt控件的自动析构的流程是这样的,如果控件有parent  widget,那么在parent析构时,自动就会析构。
如果没有,那么需要在类的析构函数中进行析构。

标准的Qt扩展行的类应该是这样的,有一个方法集合的类,对应一个纯控件的类。也就是,在声明方法类的时候,对控件不进行初始化。原因就是Qt的那些界面显示类比较大,和做纯逻辑的面向对象的语言在写代码时需要特别注意的方面有所不同。
离线benbenmajia

只看该作者 2楼 发表于: 2010-03-24
如果是栈上的不用,堆上申请的药delete
安然.....
离线午小夜

只看该作者 3楼 发表于: 2010-03-24
不指定dialog的parent,會洩露的。個人覺得這樣寫不好,要及時回收資源。
void myDialog::openDialog
{
    if(dialog != NULL)
    {
        delete dialog;
        dialog = NULL;
    }
   dialog=new QDialog;
    dialog->show();
    
}
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线yb824
只看该作者 4楼 发表于: 2010-03-24
感觉最好这样 Qt::WA_DeleteOnClose
离线磐石
只看该作者 5楼 发表于: 2010-03-24
引用第3楼午小夜于2010-03-24 09:42发表的  :
不指定dialog的parent,會洩露的。個人覺得這樣寫不好,要及時回收資源。
void myDialog::openDialog
{
    if(dialog != NULL)
    {
.......

恩,谢谢,这种做法比较容易解决我的问题的
不怕做不到,只怕想不到
离线hying

只看该作者 6楼 发表于: 2010-03-25
感觉还是yb824的更好。我现在的编程的感觉是‘能不用我亲自控制的,就不要自己控制,除非万不得以’自己控制很容易出现重复处理或者忘记处理什么的。
另外象
    if(dialog != NULL)
    {
        delete dialog;
        dialog = NULL;
    }
   dialog=new QDialog;
    dialog->show();

这样写的话,在一个窗口未关掉的时候又按了BUTTON,那就会强制释放前一个,这个情况不知道楼主是否喜欢。
离线磐石
只看该作者 7楼 发表于: 2010-03-25
引用第6楼hying于2010-03-25 10:13发表的  :
感觉还是yb824的更好。我现在的编程的感觉是‘能不用我亲自控制的,就不要自己控制,除非万不得以’自己控制很容易出现重复处理或者忘记处理什么的。
另外象
    if(dialog != NULL)
    {
        delete dialog;
.......

说的也是,这样做现在能解决我的问题,但像你说的那样,如果要打开两个新的对话框的话就不行了,呵呵,又学到点东西了,谢谢
不怕做不到,只怕想不到
离线bilyecit

只看该作者 8楼 发表于: 2010-03-25
引用第4楼yb824于2010-03-24 11:02发表的  :
感觉最好这样 Qt::WA_DeleteOnClose


这个办法好
离线lishiyong110
只看该作者 9楼 发表于: 2010-03-25
引用第8楼bilyecit于2010-03-25 16:31发表的  :
这个办法好


都很不错 小夜的方法我比较喜欢
静下心来学习
离线steinlee

只看该作者 10楼 发表于: 2010-03-27
void myDialog::openDialog
{
    if ( dialog == NULL)
    {
        dialog = new QDialog;
    }

    dialog->show();    
}

Do not forget to initialize dialog with NULL in the constructor of myDialog.
Otherwise, you may have crash.
[ 此帖被steinlee在2010-03-27 11:35重新编辑 ]
Looking for remote C/C++ and Qt 兼职
离线nmiirq

只看该作者 11楼 发表于: 2010-03-27
引用第10楼steinlee于2010-03-27 04:17发表的  :
void myDialog::openDialog
{
    if ( dialog == NULL)
    {
        dialog = new QDialog;
.......

这个更好!
离线snowdream
只看该作者 12楼 发表于: 2010-03-27
引用第4楼yb824于2010-03-24 11:02发表的  :
感觉最好这样 Qt::WA_DeleteOnClose

又强大,又简洁~
顶一个~
QQ:273247606
希望与大家一起交流QT~
离线q3310110

只看该作者 13楼 发表于: 2010-03-31
这样的实现方法本来就存在问题。
Ada.
And smile smile smile.
快速回复
限100 字节
 
上一个 下一个