函数一直无法立即退出,在等待了大约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. m_fFileInfoHandle->seek(0);
  8. QDataStream input(m_fFileInfoHandle);
  9. QMultiHash<QString, LHTFILEITEM> final;
  10. while (!input.atEnd())
  11. {
  12. QMultiHash<QString, LHTFILEITEM> tmp ;
  13. input >> tmp ;
  14. final += tmp ;
  15. }
  16. m_hFileItemInfo = final ;
  17. CloseFile(m_fFileInfoHandle);
  18. }

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

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

时间: 2024-10-19 02:46:57

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

ecmall用户登录后自动退出解决方法

一部分用户反映登录后自动退出,经过跟踪观察,发现这些用户都是动态IP,而ecmall 中的 session 刚好是与 ip 有关的,故而找不到用户回话二失败,需重新登录. 怎么处理呢? 修改 includes/libraries/session.lib.php 方法,简单粗暴,去掉 ip 判断即可,哇卡卡 /** * 生成session验证串 * * @author wj * @param string $session_id * @return stirng */ function gen_s

解决c#所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。 转载

最近做一个后来程序,启动了事务后有一段操作业务,当运行一段时间后,出现这个异常 CLR 无法从 COM 上下文 0x1b1c38 转换为 COM 上下文 0x1b1da8,这种状态已持续 60 秒.拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积.要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMulti

解决Banshee 启动后异常退出的问题

在Ubuntu上,启动Banshee后,有时会发生Banshee立刻退出的情况.通过从命令行启动banshee,发现报出如下异常. Unhandled Exception: GLib.GException: No such file or directory at GLib.FileAdapter.EnumerateChildren (System.String attributes, FileQueryInfoFlags flags, GLib.Cancellable cancellable)

新浪微博共享登录后无法退出切换账号问题解决

1.清除cookies 解决新浪共享登录后无法退出切换账号问题 NSHTTPCookie *cookie; NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (cookie in [storage cookies]) { [storage deleteCookie:cookie]; 版权声明:本文为博主原创文章,未经博主允许不得转载.

SSH远程启动tomcat后,退出SSH,tomcat也退出

在原本的启动命令 ./catalina.sh start前面加上nohup,即nohup ./catalina.sh start其中,nohup 是linux命令,不挂断运行,具体如下:语法:nohup Command [ Arg ... ] [ & ] 描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号.在注销后使用 nohup 命令运行后台中的程序.要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号

多线程的创建、退出、等待、删除语法

1.多线程创建pthread_create()的语法 2.多线程退出pthread_exit()的语法 3.多线程等待pthread_join()的语法 4.多线程删除pthread_cancel()的语法 代码分析: /* thread.c */ #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define THREAD_NUMBER 3 /*线程数*/ #define REPEAT_NUMBE

[python3.6+opencv] 02 imwrite-打开图像后保存退出还是不保存退出的问题

加载一个灰度图,显示图片,按下's'键保存后退出, 或者按下 ESC 键退出不保存 1 # -*- coding: utf-8 -*- 2 3 import numpy as np 4 import cv2 as cv 5 6 img = cv.imread("C:/Users/wyx/Desktop/xiaochougirl.jpg") 7 cv.imshow('image',img) 8 k = cv.waitKey(0) 9 if k == 27: # 按下ESC后不保存退出 1

nohup命令执行推出后进程退出

nohup命令常常用于让进程在后台执行.但是如果仅仅是执行: nohup command & 之后直接关闭终端的话,会发现之前已经启动进程也会退出.解决办法:nohup command & 之后,看到输出: appending output to nohup.out还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端. [参考]1.http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051

erlang监控进程在启动进程退出后异常退出原因分析

一.问题引出 erlang监控进程在启动时设置了trap_exit为true,即会捕获到退出信号,会将退出信号转换为{'EXIT',Pid,Reason}存入自己的邮箱中,因此与监控进程link关系的进程退出后,监控进程能够很坦然的截获退出信号,自身不退出.启动erlang监控进程的进程,会和监控进程建立link关系,然而当启动进程退出时,监控进程没有象正常的情况,发生了异常退出,为什么设置了trap_exit为true,还会退出呢? 二.原因分析 查看supervisor的源码,supervi