函数一直无法立即退出,在等待了大约30s后才能退出(QMulitHash释放不连续的内存需要很长世间,而这样设置局部变量后又无法避免这个问题)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数一直无法立即退出,在等待了大约30s后才能退出(QMulitHash释放不连续的内存需要很长世间,而这样设置局部变量后又无法避免这个问题)相关的知识,希望对你有一定的参考价值。
局部变量使用对性能的影响以及进程的堆和栈:
由于在代码中我使用了QMulitHash<QString , LHFilteVersionItem> tmp;这一局部变量来保存某一目录下的文件,由于在写测试代码期间,我利用循环模拟了50万的数据序列化后保存在文件中,在运行期间我发现读取函数耗费很长的时间,而函数里面最耗时的读取操作也只花费了很短的时间,但是函数一直无法立即退出,在等待了大约30s后才能退出,相关代码如下:
- 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释放不连续的内存需要很长世间,而这样设置局部变量后又无法避免这个问题)的主要内容,如果未能解决你的问题,请参考以下文章
Python multiprocessing:在退出父进程后运行进程