memcpy内存泄漏问题

feixue2588 2014-02-10 04:00:35
各位c语言大牛,今天在坛里的vc板块发了一个疑似内存泄漏的问题,也属于c语言范畴,请各位老大移步过去帮忙看看,直接回复本贴也可以,多谢了~
http://bbs.csdn.net/topics/390705325
...全文
1054 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
SKATE11 2014-02-10
  • 打赏
  • 举报
回复
内存泄露 !! memcpy是假象吧
feixue2588 2014-02-10
  • 打赏
  • 举报
回复
多谢各位回答!尤其是zhuobattle和jha334201553 经验证,实际情况是这样:刚分配1024*1024大小内存的时候确实是分配到虚拟内存上了,物理内存上只分配了4k。所以实际用的时候,如果是搬运小于4k,则物理内存不增加,如果大于4k再按实际需要增加物理存。 结贴
majia2011 2014-02-10
  • 打赏
  • 举报
回复
两未影射的虚址对拷,系统忽略掉了,呵呵呵
「已注销」 2014-02-10
  • 打赏
  • 举报
回复
memcpy 不会的,你任务管理器看到的应该只是当前在内存中的数据代码的总大小,那还有一部分在磁盘的pagefile里面啊,你运行函数可能将磁盘上的数据隐射到内存中导致文件增大呢,要不你把虚拟内存关掉再测测
zhuobattle 2014-02-10
  • 打赏
  • 举报
回复
引用 3 楼 feixue2588 的回复:
[quote=引用 1 楼 zhuobattle 的回复:] 程序占用的内存增加了4k?你看的是哪个内存占用?有可能是memcpy触发了虚拟内存映射到物理内存的过程,导致了物理内存涨了,这个不是内存泄漏
谢谢,我看的是当前程序.exe对应任务管理器里的“内存使用”列。 请问什么情况下会有“memcpy触发了虚拟内存映射到物理内存的过程”呢?我写的那段测试小程序就不会出现内存增加。 另外,这种情况下导致的物理内存增长为什么不算内存泄漏?系统什么时候会回收这部分内存?多谢了![/quote] 刚分配可能只是虚拟内存,你实际有数据操作时,才会映射到物理内存进行拷贝操作;你写的程序当然会有内存增加,因为你new了,你在适当的地方,比如不使用时delete [] 掉。这样当然不会内存泄漏,哪有程序不分配内存,不使用内存的。只要做好释放就OK
feixue2588 2014-02-10
  • 打赏
  • 举报
回复
引用 1 楼 zhuobattle 的回复:
程序占用的内存增加了4k?你看的是哪个内存占用?有可能是memcpy触发了虚拟内存映射到物理内存的过程,导致了物理内存涨了,这个不是内存泄漏


谢谢,我看的是当前程序.exe对应任务管理器里的“内存使用”列。

请问什么情况下会有“memcpy触发了虚拟内存映射到物理内存的过程”呢?我写的那段测试小程序就不会出现内存增加。
另外,这种情况下导致的物理内存增长为什么不算内存泄漏?系统什么时候会回收这部分内存?多谢了!
ouyh12345 2014-02-10
  • 打赏
  • 举报
回复
用工具检查,windows可以用boundchecker等
zhuobattle 2014-02-10
  • 打赏
  • 举报
回复
程序占用的内存增加了4k?你看的是哪个内存占用?有可能是memcpy触发了虚拟内存映射到物理内存的过程,导致了物理内存涨了,这个不是内存泄漏
l Valgrind查找内存泄露利器 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得你的程序更加稳固。 l Valgrind的主要功能 Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。下面分别介绍个工具的作用: l Memcheck 工具主要检查下面的程序错误: 使用未初始化的内存 (Use of uninitialised memory) 使用已经释放了的内存 (Reading/writing memory after it has been free’d) 使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks) 对堆栈的非法访问 (Reading/writing inappropriate areas on the stack) 申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever) malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete []) src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions) l Callgrind Callgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。 l Cachegrind 它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。 l Helgrind 它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为” Eraser” 的竞争检测算法,并做了进一步改进,减少了报告错误的次数。 l Massif 堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。 Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧