• 8620阅读
  • 20回复

一个关于类内存泄漏的问题 [复制链接]

上一主题 下一主题
离线rocenting
 

只看楼主 倒序阅读 楼主  发表于: 2009-02-07
重复调用以下两段程序,在关闭第一次打开的窗口,第二次打开会不会造成内存泄漏。还是关闭窗口的时候,系统会自动释放类所占的内存。
mainWin = new MainWindow;
mainWin->show();

对于c++类的内存认识有点模糊,哪位高手请解释一下。
[ 此贴被rocenting在2009-02-08 00:23重新编辑 ]
只看该作者 1楼 发表于: 2009-02-07
按x其实是close,就是hide,窗口根本就在,就是没显示而已
离线rocenting

只看该作者 2楼 发表于: 2009-02-08
谢谢了你的回答,我测试过了,正如你所说,呵呵

还问一个问题

我想实现a窗口关闭,也就是按X,并顺便通知b窗口,并让b窗口做一些事情。

QObject::connect(&a, SIGNAL(a窗口关闭信号), &b, SLOT(b窗口处理函数));

这里“a窗口关闭信号”,从哪里可以查得到.

我查了好久,总以为存在qt signals全部的列表的东西,可是一无所获。
离线roc496
只看该作者 3楼 发表于: 2009-02-08
重载closeEvent()
在关闭时会运行这个函数
看看我写的那篇关于内存的吧...
离线rocenting

只看该作者 4楼 发表于: 2009-02-08
谢谢解答

问题是重载的时候能不能删除对象本身

我想运行

delete mainWin
离线rocenting

只看该作者 5楼 发表于: 2009-02-08
不同class的对象之间可以通过QObject::connect通讯吗
离线roc496
只看该作者 6楼 发表于: 2009-02-08
???
主窗口?
它会自动销毁的
自动delete
离线roc496
只看该作者 7楼 发表于: 2009-02-08
只要是QObejct直接或间接派生的都可以
离线rocenting

只看该作者 8楼 发表于: 2009-02-08
引用第6楼roc496于2009-02-08 00:59发表的  :
???
主窗口?
它会自动销毁的
自动delete



我是通过dialog上一个按钮调用一个主窗口

所以不会主动销毁的。
离线roc496
只看该作者 9楼 发表于: 2009-02-08
那你再在closeEvent()里emit一个signal啊
再用这个connect一个函数专门用来销毁窗口呗...
离线rocenting

只看该作者 10楼 发表于: 2009-02-08
我也是这么干的

可是slot 函数没有反应

我的代码如下QObject::connect(mainWin, SIGNAL(MainWindow::closeSignal()), this, SLOT(dosomething()));

两个对象是不同类的

在MainWindow就能接受到自己发出的信号。
只看该作者 11楼 发表于: 2009-02-08
其实……deleteLater不就好了
离线rocenting

只看该作者 12楼 发表于: 2009-02-08
谢谢,我试一下。

不过不同类对象之间为什么收不到信号的原因是什么很想知道。
离线rocenting

只看该作者 13楼 发表于: 2009-02-08
测试了一下,你的方式可行。

看来qt的水太深了,一下子看不到底。

除了文档,有什么好的资料好介绍的吗?
只看该作者 14楼 发表于: 2009-02-08
QObject::connect(mainWin, SIGNAL(MainWindow::closeSignal()), this, SLOT(dosomething()));

                                                    不存在这个信号唉……就算存在也是不用写    MainWindow:: 的
离线rocenting

只看该作者 15楼 发表于: 2009-02-08
这个信号是我自定义的

就是重载closeEvent的时候emit出去

void MainWindow::closeEvent(QCloseEvent *event)
{
    emit  closeSignal();
}

那怎么写啊,哈哈
离线rocenting

只看该作者 16楼 发表于: 2009-02-08
引用第14楼都市无名者于2009-02-08 11:11发表的  :
QObject::connect(mainWin, SIGNAL(MainWindow::closeSignal()), this, SLOT(dosomething()));
                                                    不存在这个信号唉……就算存在也是不用写    MainWindow:: 的


像如下这么写也收不到
QObject::connect(mainWin, SIGNAL(closeSignal()), this, SLOT(dosomething()));
只看该作者 17楼 发表于: 2009-02-08
有没有在定义类的时候加上

Q_OBJECT?
那个dosomething()也是自定义的吧
离线rocenting

只看该作者 18楼 发表于: 2009-02-08
肯定有
我在MainWindow里面
connect(this, SIGNAL(closeSignal()),this, SLOT(abc()));

abc() slot是能执行的

但我在dialog类里面
QObject::connect(mainWin, SIGNAL(closeSignal()), this, SLOT(dosomething()));
dosomething() slot就没有执行。(这里是在dialog里面new 一个MainWindow类)
离线rocenting

只看该作者 19楼 发表于: 2009-02-08
高手,行了,呵呵
离线rocenting

只看该作者 20楼 发表于: 2009-02-08
现在同一个类和不同类的对象都能接受到信号了。

就是 MainWindow:: 这个问题,才刚弄两天qt,项目急

没有太多功夫看资料啦,看来得磨练磨练才能上手。

特别是细节方面。另外,对你表示万分谢意。
快速回复
限100 字节
 
上一个 下一个