首页 > 代码库 > 函数一直无法立即退出,在等待了大约30s后才能退出(QMulitHash释放不连续的内存需要很长世间,而这样设置局部变量后又无法避免这个问题)
函数一直无法立即退出,在等待了大约30s后才能退出(QMulitHash释放不连续的内存需要很长世间,而这样设置局部变量后又无法避免这个问题)
局部变量使用对性能的影响以及进程的堆和栈:
由于在代码中我使用了QMulitHash<QString , LHFilteVersionItem> tmp;这一局部变量来保存某一目录下的文件,由于在写测试代码期间,我利用循环模拟了50万的数据序列化后保存在文件中,在运行期间我发现读取函数耗费很长的时间,而函数里面最耗时的读取操作也只花费了很短的时间,但是函数一直无法立即退出,在等待了大约30s后才能退出,相关代码如下:
[cpp] view plain copy
- void LHTWORKFLOW::ReadAllDataFromFile(QMultiHash<QString, LHTFILEITEM> &m_hFileItemInfo)
- {
- if (NULL == m_fFileInfoHandle)
- {
- OpenFile(m_sFileItemInfoAbsolutePath , 0);
- }
- m_fFileInfoHandle->seek(0);
- QDataStream input(m_fFileInfoHandle);
- QMultiHash<QString, LHTFILEITEM> final;
- while (!input.atEnd())
- {
- QMultiHash<QString, LHTFILEITEM> tmp ;
- input >> tmp ;
- final += tmp ;
- }
- m_hFileItemInfo = final ;
- CloseFile(m_fFileInfoHandle);
- }
经过仔细分析和思考,发现问题就出在局部变量final上,由于是局部变量,因此当函数执行完毕后局部变量就要销毁,由于是QMultiHash类型的变量,我们知道Hash相比数组来说它的一大好处是数据地址不连续,元素在内存控件中占用的内存地址是不连续的,而数据量又大,因此在销毁的过程中应该是逐步遍历去释放内存指针去了。如果是数组这种连续的数据结构的话,释放会很快,只需要把该块内存的标志设为无用它就又可以被系统回收利用了。这种情况还是我第一次碰到,感到很有意思,对我以后的代码编写也有一定的知道意义,于是我就查阅了进行相关堆和栈的相关内容。
http://blog.csdn.net/houqd2012/article/details/25070987
函数一直无法立即退出,在等待了大约30s后才能退出(QMulitHash释放不连续的内存需要很长世间,而这样设置局部变量后又无法避免这个问题)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。