社区
C++ 语言
帖子详情
频繁new大内存后delete动作,导致out of memory?如何解决呢?
kingovern
2011-04-01 10:07:06
我在一个函数中读取百兆以上大文件数据,用new开销,进行数据操作后delete。但是当我频繁调用该函数时,产生内存溢出。该如何解决呢?
...全文
444
20
打赏
收藏
频繁new大内存后delete动作,导致out of memory?如何解决呢?
我在一个函数中读取百兆以上大文件数据,用new开销,进行数据操作后delete。但是当我频繁调用该函数时,产生内存溢出。该如何解决呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
stain_less
2011-04-02
打赏
举报
回复
只能用单态设计模式来解决
辰岡墨竹
2011-04-01
打赏
举报
回复
多余大于5MB以上的内存分配不要使用new,因为new是对malloc的封装,而malloc封装了HeapAlloc。Windows的堆默认大小为1MB,虽然会自动增长,但是他本身的分配算法是适合较小的零碎数据。而且HeapAlloc又是靠VirtualAlloc分配内存页的,所以频繁调用效率会低好多倍。
对于大文件应该先用VirtualAlloc分配一块大的内存区域,然后用MapFile映射文件,因为有磁盘缓冲区的,所以只要你的读写是比较有序的话,性能是很高的。不过如果你不要求文件的实时更新的话,可以直接把文件读入到VirtualAlloc分配的区域里,修改设计,取消不必要的读写。
snake_xiongyang
2011-04-01
打赏
举报
回复
LS说的就是单一实例设计模式 楼主你的情况确实很适合这种情况
而且就算是你正确地删除了实例,因为new delete的缘故 依然性能低。
如果可以确保只有有限个实例,可以使用这个模式
stain_less
2011-04-01
打赏
举报
回复
频繁使用new,产生多个对象实例,即使删除了数据,实例对象依旧逐流内存成为垃圾,垃圾没有及时回收导致内存溢出。
建议不要“用new开销”,调用这个函数时不要用new创建对象,而在需要对象实例的类中用静态方法提前new一个实例,外部需要这个类的实例的时候,不再new,而是都调用这个静态方法,并提供这个静态方法new的那个实例,这样,即使多次调用函数,内存中只有一个对象实例,不会出现内存溢出。
iambic
2011-04-01
打赏
举报
回复
不要频繁申请释放,使用内存池之类的重用内存。
pathuang68
2011-04-01
打赏
举报
回复
1. 考虑使用内存映射,即用操作内存的方式,操作硬盘,性能肯定会有所下降;
2. 重构你的设计。既然一次性把几百兆的文件,读入内存,这种new或者delete就不应该太过频繁。
顺便问一下,大概多长时间就要进行一次new/delete操作?
kingovern
2011-04-01
打赏
举报
回复
是的,LoadFromFile,一次性读入。
showjim
2011-04-01
打赏
举报
回复
汗,难道每次都把整个文件读到内存?
luciferisnotsatan
2011-04-01
打赏
举报
回复
内存映射
另外,你也不用把百兆的一起加到内存里吧。
bdmh
2011-04-01
打赏
举报
回复
看你怎么弄得了,怎么打开的文件,对于大文件,建议用内存映射
c_losed
2011-04-01
打赏
举报
回复
44 内存映射
cxyOOOO
2011-04-01
打赏
举报
回复
物理内存多少,怎样频繁,最好能调试一下查原因,2G的进程空间消耗光,还不带回收的(假设进程只开单个文件缓冲的情况感觉比较奇怪哈,多开倒是可能)。
赵4老师
2011-04-01
打赏
举报
回复
读写超过2GB的文件用_lseeki64函数
赵4老师
2011-04-01
打赏
举报
回复
内存碎片
quwei197874
2011-04-01
打赏
举报
回复
用内存池.
ameyume
2011-04-01
打赏
举报
回复
[Quote=引用 14 楼 luciferisnotsatan 的回复:]
还是应该把数据拆开来。
如果你是32位系统,那么你能用的也就2G(非3G用户态内存情况下)不到。而你要new个百兆的连续地址,那是比较困难的。比如你要new个 500M的,即使还有1G多的空间,但也不一定有连续500M的给你用
[/Quote]
就是,new的内存都是连续分配的,哪有那么多内存供你频繁操作。即使new完立刻delete,这时候也不一定就立刻释放了。
luciferisnotsatan
2011-04-01
打赏
举报
回复
还是应该把数据拆开来。
如果你是32位系统,那么你能用的也就2G(非3G用户态内存情况下)不到。而你要new个百兆的连续地址,那是比较困难的。比如你要new个 500M的,即使还有1G多的空间,但也不一定有连续500M的给你用
太乙
2011-04-01
打赏
举报
回复
加内存!
苍蝇①号
2011-04-01
打赏
举报
回复
可以设置内存池 循环使用 减少new delete的频次
返回值 hr=E_OUTOF
MEMORY
时的
解决
的一个
解决
方法
E_OUTOF
MEMORY
最近在维护一个以Directshow框架构建的一个摄像头程序时,发现当摄像头分辨率超过1920*1080后,在YUY2 Format会随着分辨率的提高更
频繁
出现E_OUTOF
MEMORY
,而不能Preview的情况,摄像头还支持MJPG,不过还行在MJPG好像没有这个问题。 分辨率定义如下 #define DF_IMG_SIZE_3M 20481536 #define...
记一次
内存
不足
导致
程序core问题
最近测试服经常出现因为
内存
不足
导致
程序被Kill,看core也看不出什么问题。 只是一次BUG修补记录,具体问题仍需根据实际场景具体分析。 一、如何定位到是因为
内存
不足才被Kill 使用dmesg命令查看内核日志,类似有Out of
memory
: Kill process,基本上可以确定是
内存
不足了。 Out of
memory
问题,这通常是因为某时刻应用程序大量请求
内存
导致
系统
内存
不足...
【入门C++编程的艺术】C++
内存
管理 |
new
和
delete
| operator
new
| operator
delete
| 定位
new
new
和
delete
针对内置类型与C的malloc/free无大区别但是对于自定义类型,区别很大!这也是引入
new
/
delete
的原因
new
/
delete
针对自定义类型,与malloc/free最大的区别就是
new
的时候会自动调用 默认构造函数(如果无默认构造会报错)
delete
的时候会自动调用析构函数单个自定义类型对象的构造/析构//malloc只是申请空间exit(-1);//1.
new
申请空间 2. 调用默认构造函数初始化// 显示传递参数来构造free(p1);
关注我,
内存
泄漏和
内存
溢出的定义及其
解决
方案
理解区别:泄漏是“只进不出”,溢出是“要太多却没有”。泄漏是原因,溢出可能是结果。重在预防:C/C++:优先使用 智能指针和 RAII 机制管理资源。:理解垃圾回收机制,注意避免循环引用(特别是被全局变量或静态变量引用),必要时使用弱引用。所有语言:注意及时释放非
内存
资源(文件、连接等)。善用工具:在开发测试阶段积极使用
内存
检测工具来发现潜在问题。监控与 profiling:对长期运行的系统,进行持续的
内存
使用监控。
Qt绘制云盘系列1
先抛出一个问题:QImage: out of
memory
, returning null image,下方错误示范效果图报出此错误,希望各位大佬们帮忙
解决
一下,在此先谢谢了! 工程链接-百度云链接:https://pan.baidu.com/s/1nccUlTPgZQc5QeP2bzczcw 提取码:akvt 错误示范效果图: 实际上应该是下方这个效果,但是由于QImage: out of m...
C++ 语言
65,210
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章