• 6418阅读
  • 5回复

[提问]初看hello Qt程序的几个疑惑 [复制链接]

上一主题 下一主题
离线oneofzero
 
只看楼主 倒序阅读 楼主  发表于: 2011-08-25
今天买了c++ gui qt4 编程的书。
第一章  hello qt 程序:
int main(int argc, char* argv[])
{
QApplication app(argc,argv);
QLabel* label = new QLabel("Hello Qt!")
label->show();
return app.exec();
}

疑惑1:label 只要new 出来 就能在窗口上了吗?
疑惑2:label new 出来了不需要delete吗?
疑惑3:听说是label 在其他的窗口上,就会随着其他窗口析构而析构。那这个时候label 指针不是野指针了吗。
疑惑4:qt  为啥不用 share_ptr  weak_ptr?来避免疑惑3。。。
离线hicjiajia

只看该作者 1楼 发表于: 2011-08-25
1 你的程序只有一个label,所以默认主窗体就是label,外面加上了边框而已;否则需要设置父子关系…
23 qt会跟踪你的动态内存分配,来减轻你的负担,你可以在程序中new多个空间,在适当的时候qt会干掉他们,释放后指针会指向内存低64kb的地方,也就是指向NULL ,除非你要立即回收已分配过的内存,这时才要delete…
离线dbzhang800

只看该作者 2楼 发表于: 2011-08-25
这个例子确实是内存泄漏。改进办法的很多

在这个问题上,我也曾写过一点东西
http://blog.csdn.net/dbzhang800/article/details/6403285
离线roywillow

只看该作者 3楼 发表于: 2011-08-25
那个例子不管怎么看好像都是不合适的
记得原书中好像说什么这点泄露很小不用在意
大概作者是想强调使用可视化组件的时候要通过声明指针然后new,而不是直接实例化(后者的问题主要在跳出函数作用域时出现)
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线oneofzero
只看该作者 4楼 发表于: 2011-08-26
回 1楼(hicjiajia) 的帖子
释放后指针会指向内存低64kb的地方,也就是指向NULL

这个是怎么做到的?
QLabel* label  应该是个普通指针。指向的对象被删除,这个指针为什么可以自动指向NULL?
离线hicjiajia

只看该作者 5楼 发表于: 2011-08-26
回 4楼(oneofzero) 的帖子
要避免野指针把它指向NULL就好了,防止它乱指,源码确实是这样作的,在指针指向的内存释放后,紧接着代码给指针付值0,这是qt内部指针使用的情况;对于用户指针开辟内存空间的回收,qt不一定会接管,有两种情况一定会接管,一种是给它设置父对象,一种是qt某些函数要求用new返回的指针做参数,其它情况你要自己负责回收…
快速回复
限100 字节
 
上一个 下一个