函数一直无法立即退出,在等待了大约30s后才能退出(QMulitHash释放不连续的内存需要很长世间,而这样设置局部变量后又无法避免这个问题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数一直无法立即退出,在等待了大约30s后才能退出(QMulitHash释放不连续的内存需要很长世间,而这样设置局部变量后又无法避免这个问题)相关的知识,希望对你有一定的参考价值。

局部变量使用对性能的影响以及进程的堆和栈:

        由于在代码中我使用了QMulitHash<QString , LHFilteVersionItem> tmp;这一局部变量来保存某一目录下的文件,由于在写测试代码期间,我利用循环模拟了50万的数据序列化后保存在文件中,在运行期间我发现读取函数耗费很长的时间,而函数里面最耗时的读取操作也只花费了很短的时间,但是函数一直无法立即退出,在等待了大约30s后才能退出,相关代码如下:

 

[cpp] view plain copy
 
  1. void LHTWORKFLOW::ReadAllDataFromFile(QMultiHash<QString, LHTFILEITEM> &m_hFileItemInfo)  
  2. {  
  3.     if (NULL == m_fFileInfoHandle)  
  4.     {  
  5.         OpenFile(m_sFileItemInfoAbsolutePath , 0);  
  6.     }  
  7.   
  8.     m_fFileInfoHandle->seek(0);  
  9.   
  10.     QDataStream input(m_fFileInfoHandle);  
  11.   
  12.     QMultiHash<QString, LHTFILEITEM> final;  
  13.     while (!input.atEnd())  
  14.     {  
  15.         QMultiHash<QString, LHTFILEITEM> tmp ;  
  16.         input >> tmp ;  
  17.         final += tmp ;  
  18.     }  
  19.   
  20.     m_hFileItemInfo = final ;  
  21.     CloseFile(m_fFileInfoHandle);  
  22. }  

经过仔细分析和思考,发现问题就出在局部变量final上,由于是局部变量,因此当函数执行完毕后局部变量就要销毁,由于是QMultiHash类型的变量,我们知道Hash相比数组来说它的一大好处是数据地址不连续,元素在内存控件中占用的内存地址是不连续的,而数据量又大,因此在销毁的过程中应该是逐步遍历去释放内存指针去了。如果是数组这种连续的数据结构的话,释放会很快,只需要把该块内存的标志设为无用它就又可以被系统回收利用了。这种情况还是我第一次碰到,感到很有意思,对我以后的代码编写也有一定的知道意义,于是我就查阅了进行相关堆和栈的相关内容。

 

http://blog.csdn.net/houqd2012/article/details/25070987

以上是关于函数一直无法立即退出,在等待了大约30s后才能退出(QMulitHash释放不连续的内存需要很长世间,而这样设置局部变量后又无法避免这个问题)的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 C++ 控制台应用程序立即退出?

Python multiprocessing:在退出父进程后运行进程

C++11:如何在 std::thread 的执行函数退出后立即加入它?

docker容器运行后退出,怎么才能一直运行?

在命令行下面打开我自己的程序后CMD不退出,一直等待!!

处理 SIGTERM 后无法使用条件变量正确退出子进程