• 3566阅读
  • 8回复

[提问]一个简单程序(3行)引起的两个内存疑惑 [复制链接]

上一主题 下一主题
离线stlcours
 

只看楼主 倒序阅读 楼主  发表于: 2015-08-05
void xccxds::on_pushButton_1_clicked()
{
    QStringList list;
    for (int i=0; i<5000000; i++)  {
        list << QString::number(i);
    }
    QMessageBox::question(NULL, "Test", "finish", QMessageBox::Yes);
    list.clear();
    QMessageBox::question(NULL, "Test", "finish", QMessageBox::Yes);
}
以上就是程序的全部。这里引起两个问题
1. 每次点击按钮后,程序使用内存会上升100K~2M内存不等,只增加而不减少。这样如果多次点击的话,会造成内存累计十分可观,所以必须解决这个问题,可这个程序的问题出在哪里呢?
2. 以上程序的两个QMessageBox和手动执行list.clear()语句纯粹是为了让各位感受时间的,去掉的话,问题1仍然存在。但是此程序在VC2010 release下编译,list.clear()运行时间需要长达30秒以上,而MingW release只需要不到1秒,这是为什么呢?
离线firebolt

只看该作者 1楼 发表于: 2015-08-06
内存预分配的确是只增加不减少。
离线stlcours

只看该作者 2楼 发表于: 2015-08-06
回 firebolt 的帖子
firebolt:内存预分配的确是只增加不减少。
 (2015-08-06 13:28) 

你说的是验证了我的这个程序,还是说的是所有程序的普遍情况?
离线firebolt

只看该作者 3楼 发表于: 2015-08-07
回 stlcours 的帖子
stlcours:你说的是验证了我的这个程序,还是说的是所有程序的普遍情况? (2015-08-06 16:08) 

是普遍情况,尤其是你这种情况,QString 小内存分配很废资源。
离线stlcours

只看该作者 4楼 发表于: 2015-08-07
回 firebolt 的帖子
firebolt:是普遍情况,尤其是你这种情况,QString 小内存分配很废资源。 (2015-08-07 09:33) 

扯。释放了,就应该释放的干干净净。普通程序员都要做到的事情,QT官方为什么做不到?
假如我这几行代码是没几分钟就要运行一次,不出几天,内存就会不够用了,这是什么道理?可是我的代码没有逻辑错误啊,所以还是要正面解决这个问题,即使是QT官方的错误,也要协助它解决。
离线firebolt

只看该作者 5楼 发表于: 2015-08-07
回 stlcours 的帖子
stlcours:扯。释放了,就应该释放的干干净净。普通程序员都要做到的事情,QT官方为什么做不到?
假如我这几行代码是没几分钟就要运行一次,不出几天,内存就会不够用了,这是什么道理?可是我的代码没有逻辑错误啊,所以还是要正面解决这个问题,即使是QT官方的错误,也要协助它解决。 (2015-08-07 15:20) 

嘿嘿,别丢人了,内存管理策略而已。
离线stlcours

只看该作者 6楼 发表于: 2015-08-07
回 firebolt 的帖子
firebolt:嘿嘿,别丢人了,内存管理策略而已。 (2015-08-07 17:47) 

什么策略?谁来管理?
离线firebolt

只看该作者 7楼 发表于: 2015-08-07
回 stlcours 的帖子
stlcours:什么策略?谁来管理? (2015-08-07 18:03) 

这个一两句真说不清楚,先看看内存池吧。管理是Qt框架来管理,你看看它底层的代码就知道了。
离线stlcours

只看该作者 8楼 发表于: 2015-08-07
内存池的意义我理解,但也不是不停的增长内存,而是主要是复用内存的概念。
何况我也看过别的框架代码,也没见到内存不停的往上涨啊,何况每次增长100K可不少呢。
快速回复
限100 字节
 
上一个 下一个