new操作符分配内存问题

jason176374 2011-12-01 03:53:17
各位大虾,小弟在开发程序中遇到一些问题,希望获得帮助!

我的程序中有一个工作线程,持续的处理一些文件i/o操作。当我平凡的处理一些大数据块时(100MB)拷贝在内存中。发现一次任务执行完毕,有线程来不及释放内存的现象。持续几个任务后,使用 new [] 操作符分配100MB左右的内存就会导致线程卡死。既 new [] 函数无法返回。。。

希望遇到过类似问题的大虾解答!?不胜感激
...全文
139 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jason176374 2011-12-02
  • 打赏
  • 举报
回复
自己顶下,求高手拯救。。。
jason176374 2011-12-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wtx_sonery 的回复:]
一次性分配足够大的内存来用吧。。

频繁new/delete导致内存脆片变多,再加上你分的很大。。
[/Quote]

感谢wtx_sonery回复,您说的很有道理。。。

但是小弟刚才测试代码
for ( int i = 0; i < 20; i++ )
{
vector<char> pChar;
pChar.resize(100000000);
memset(&pChar[0], 'A', 100000000 );

pChar.clear();
pChar.resize(0);
}
以这样的方式执行后,也完全不影响程序执行结果。。。。


是不是还受其他问题影响呢?
jason176374 2011-12-02
  • 打赏
  • 举报
回复
各位大虾,小弟测试了一个上午,尝试了好几种实现方法,始终无法解决上述问题。

程序循环的在一个线程中做大文件的编码压缩工作。压缩第一次,第二次时一切正常,观察任务管理器,每次任务结束后内存均完全释放。第三次在分配大块内存vector<char>.resize(100000000);时inline void* __stl_new(size_t __n) { _STLP_CHECK_NULL_ALLOC(::operator _STLP_NEW(__n)); }函数抛出bad_alloc异常。。并且无法被try{}catch(Exception &ex)截获。。。

我使用
vector<char>.resize分配内存
vector<char>.clear(); vector<char>.resize(0);及析构函数 来释放内存

我使用的编译器是BCB6.0,希望遇到过此类问题的大虾,给予小弟帮助,感激不尽。。。。
gameslq 2011-12-01
  • 打赏
  • 举报
回复
不采用额外内的存分配策略
new 完后 记得delete
也可以分配一次足够大的内存,连续用
最后再释放
也可以采用内存池的设计逻辑.
jason176374 2011-12-01
  • 打赏
  • 举报
回复
感谢各位大虾回复~~

我观察下来肯定没有内存释放干净的问题,因为整个逻辑中只有一处是我自己申请的内存(就是哪个100MB内存)。 其他都是调用系统API。观察任务管理器内存增减情况,发现系统API内部也有内存的申请/释放。。。。 我使用的系统API是ACM 录音文件(WAV)编码函数。。。

是不是在线程中频繁的申请/释放大块内存,真会引发以上错误发生呢?
Eleven 2011-12-01
  • 打赏
  • 举报
回复
可以考虑使用内存池方案~
每件事 2011-12-01
  • 打赏
  • 举报
回复
同上 。我觉得你是不是有每次都没释放干净,有内存泄露?
yuucyf 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 jason176374 的回复:]
各位大虾,小弟在开发程序中遇到一些问题,希望获得帮助!

我的程序中有一个工作线程,持续的处理一些文件i/o操作。当我平凡的处理一些大数据块时(100MB)拷贝在内存中。发现一次任务执行完毕,有线程来不及释放内存的现象。持续几个任务后,使用 new [] 操作符分配100MB左右的内存就会导致线程卡死。既 new [] 函数无法返回。。。

希望遇到过类似问题的大虾解答!?不胜感激
[/Quote]
这种情况比较适合用内存池.
  • 打赏
  • 举报
回复
一次性分配足够大的内存来用吧。。

频繁new/delete导致内存脆片变多,再加上你分的很大。。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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