• 11426阅读
  • 17回复

关于addTab,tabWidget的研究,太诡异了!代码其实很简单,大家不妨看, [复制链接]

上一主题 下一主题
离线iiiyyyhhhsss
 

只看楼主 倒序阅读 楼主  发表于: 2009-09-17
我想问的是,按道理下面第一个和第三个最终显示的效果应该是一样的吧?为什么却出现了不一样的效果?

个人认为,三个例子的效果应该是一样的,因为text都是局部变量,当函数执行完毕,就over了,三个页面都不可能被保留下来!为什么第一和第二的页面还能保留下来呢?


注:tabWidget是类HText的成员
---------------------------------
void HText::HTextAddText()
{
    QTextEdit *text=new QTextEdit;
    text->setPlainText("123456");
    this->tabWidget->addTab(text,"new");
}

上面是我的一个槽函数,按下钮按调用这个槽函数,上面执行后的实际效果是:的确tabWidget增加了一个页面,而且页面是一个TextEdit,内容是123456
----------------------------------
再看看以下代码效果(代码写在HText的构造函数里):
QTextEdit *text=new QTextEdit;
text->setPlainText("123456");
this->tabWidget->addTab(text,"new");

实际效果和上面一样,页面保留下来,显示内容是123456
----------------------------------
最后看看这个,(代码写在HText的构造函数里):
QTextEdit *text=new QTextEdit;
text->setPlainText("123456");
this->tabWidget->addTab(text,"new");
delete text;
实际效果:但是,这里却出现了意外的效果,页面不见了,和上面两例子不一样!!!!
---------------------------------
[ 此帖被iiiyyyhhhsss在2009-09-17 15:55重新编辑 ]
离线cnnbboy

只看该作者 1楼 发表于: 2009-09-17
囧。。。。。谁跟你说的第一个会删除
离线iiiyyyhhhsss

只看该作者 2楼 发表于: 2009-09-17
为什么不会删除呢?不是说局部变量的生存期都只是局限于函数的执行周期吗?如果没有被删除,那为什么在程序的其它地方用text这个变量的时候,编译会报错呢,text没有被定义。。
离线iiiyyyhhhsss

只看该作者 3楼 发表于: 2009-09-17
第一个函数执行完毕后,text变量是肯定没有了的,那对于text变量来说,和第三个有什么区别?
离线cnnbboy

只看该作者 4楼 发表于: 2009-09-17
你可以去理解下堆和栈了,最关键的是你text不是局部变量。我多次看到你问了非常基础的问题,如果你是学生,先打好基础再说,一蒙子就学Qt很盲目
离线iiiyyyhhhsss

只看该作者 5楼 发表于: 2009-09-17
在函数里定义的为什么不是局部变量呢?

那么,如果函数执行完后,它没有被删除,就是说它还存在,在函数外我如何使用它呢?
离线iiiyyyhhhsss

只看该作者 6楼 发表于: 2009-09-17
我理解了!它是动态分配内存的。
那么我还想问,离开了函数后,如何使用它呢?
离线iiiyyyhhhsss

只看该作者 7楼 发表于: 2009-09-17
我问了问我同学,他说当离开了函数后,text指针就没有了,但是text的内容还是存在于内存的,他说如果要使用它就需要用办法获得它的句柄,如何获得他也不太清楚。。

但是我却是这样认为的,大家看有没有道理:

我把程序执行后,虽然离开了函数,但是最后页面保留了下来,而且我可以在那个页面(即那个textEdit)上输入,那么我键盘输入的那些字符既然可以输入到那个内存空间中,那么,qt必定是有记录他的这份内存的地址(尽管text指针已经没有了)的,否则根本不可能从键盘上输入到这个textedit控件上。。那么qt中记录了这个地址,应该是有一个成员变量来记录的,大家是否知道这个成员是什么?
[ 此帖被iiiyyyhhhsss在2009-09-17 17:28重新编辑 ]
离线cnnbboy

只看该作者 8楼 发表于: 2009-09-17
我说的很清楚了,你去搜搜堆和栈,马上就能理解了
离线iiiyyyhhhsss

只看该作者 9楼 发表于: 2009-09-17
现在的问题是,当离开了函数后,如何对那快text原来指向的内存进行操作?tabWidget里应该有成员作那会内存地址的备份吧?
否则程序运行后,我不可能在键盘上输入东西到刚才那个textEdit的。既然可以输入,程序里应该是有这快内存地址的备份,备份这份地址的成员是哪个呢?
离线iiiyyyhhhsss

只看该作者 10楼 发表于: 2009-09-17
好的
离线iiiyyyhhhsss

只看该作者 11楼 发表于: 2009-09-17
我看过堆和栈了,一定程度上能理解了

那么,离开函数后,局部指针text没有了,但我不希望用一个成员或者全局变量来存放这个指针,

我觉得把textEdit放进tabWidget后,通过tabWidget作为入口,应该能对textEdit进行操作,大家怎么看?
离线xhxui

只看该作者 12楼 发表于: 2011-06-18
第三组这样修改就ok了
this->tabWidget->addTab(text,"new");
//先将指针text设置为空,再删除
text = 0;
delete text;
离线dbzhang800

只看该作者 13楼 发表于: 2011-06-18
引用第12楼xhxui于2011-06-18 06:39发表的  :
第三组这样修改就ok了
this->tabWidget->addTab(text,"new");
//先将指针text设置为空,再删除
text = 0;
delete text;
.......

这??哪个老师教的啊 ^_^
离线myseemylife

只看该作者 14楼 发表于: 2011-06-18
回 4楼(cnnbboy) 的帖子
text这个指针变量是局部变量,tex变量的值是new出来的堆内存的首地址,退出函数之后。text的值被销毁,(因为text变量是局部变量),因该是这样理解吧?
蠢笨的愚钝~
离线xhxui

只看该作者 15楼 发表于: 2011-06-18
引用第13楼dbzhang800于2011-06-18 08:55发表的  :
这??哪个老师教的啊 ^_^


呵呵,我在学C++时,书上说:在删除一个指针前,应该先将指针设置为空。因为不正确的删除指针会发生不可预期的错误,而删除空指针却是合法的。
这个例子我试过了。加上那一行刚好ok。可能是个巧合,嘎嘎!

离线dbzhang800

只看该作者 16楼 发表于: 2011-06-18
引用第15楼xhxui于2011-06-18 16:44发表的  :
[表情] 呵呵,我在学C++时,书上说:在删除一个指针,应该先将指针设置为空。因为不正确的删除指针会发生不可预期的错误,而删除空指针却是合法的。
这个例子我试过了。加上那一行刚好ok。可能是个巧合,嘎嘎!


呵呵,不清楚你当时看的什么书。但我相信是你记错了,不是"前",而是"后"
离线jdwx

只看该作者 17楼 发表于: 2011-06-18
首先New和Delete一定要配对用,除非在QT里New控件用this参数,QT在需要销毁控件时自动销毁,不用自己写Delete了。其它时候必须自己Delete,要不然就会内存泄漏了。也就是说函数执行完了,指针被销毁了(仅限于指针变量本身)指针指向的内存没有被回收。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
快速回复
限100 字节
 
上一个 下一个