C#内存管理问题

alexsun6 2016-08-23 02:09:19
c#调用c++动态库得到一张图像:

imgBuffer = Marshal.AllocHGlobal(imageProp.ImgHeight * imageProp.ImgWidth * Marshal.SizeOf(typeof(ushort)));
CDetManager.Acquisition(imgBuffer, nDET);

然后将此图处理,并显示:

byte[] data = new byte[imgp.ImgHeight * imgp.ImgWidth * 2];
Marshal.Copy(imgBuffer, data, 0, imgp.ImgHeight * imgp.ImgWidth * 2);

但是在new byte[]的时候,调试状态总是崩溃,提示OutOfMemoryException,但是从exe执行该程序,一切正常。
请问该怎么解决需要释放内存吗?
...全文
299 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexsun6 2016-08-24
  • 打赏
  • 举报
回复
引用 13 楼 shingoscar 的回复:
但是你分配的内存并不大 所以有可能是前面的函数破坏了内存导致的
如果是这个原因的话,直接从exe执行程序也应该有这个问题吧。 可是exe执行就没问题,vs调试就不行。
Poopaye 2016-08-24
  • 打赏
  • 举报
回复
但是你分配的内存并不大 所以有可能是前面的函数破坏了内存导致的
alexsun6 2016-08-24
  • 打赏
  • 举报
回复
引用 11 楼 shingoscar 的回复:
[quote=引用 8 楼 alexsun6 的回复:] [quote=引用 6 楼 shingoscar 的回复:] 试了下,写个new byte[18433024] + AllocHGlobal,完全没问题,dev只占用了约200M+ 很可能是前面的语句导致的,试着注释掉一部分
整个程序占用内存很大,但我很奇怪的是为什么直接运行exe没有问题,vs运行就有问题。[/quote] 因为调试器要更多内存,否则各个堆栈的局部变量要保存在哪里啊[/quote] 但是我把内存从4G扩展到8G,效果还是一样,没变化。难道调试器会有使用内存的限制?
Poopaye 2016-08-23
  • 打赏
  • 举报
回复
引用 8 楼 alexsun6 的回复:
[quote=引用 6 楼 shingoscar 的回复:] 试了下,写个new byte[18433024] + AllocHGlobal,完全没问题,dev只占用了约200M+ 很可能是前面的语句导致的,试着注释掉一部分
整个程序占用内存很大,但我很奇怪的是为什么直接运行exe没有问题,vs运行就有问题。[/quote] 因为调试器要更多内存,否则各个堆栈的局部变量要保存在哪里啊
飞天凤凰601 2016-08-23
  • 打赏
  • 举报
回复
data定义大一点看看
alexsun6 2016-08-23
  • 打赏
  • 举报
回复
引用 7 楼 From_TaiWan 的回复:
非托管的需要手动释放内存, Marshal.FreeHGlobal(imgBuffer);
我用Marshal.FreeHGlobal()了,但效果一样。
alexsun6 2016-08-23
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
试了下,写个new byte[18433024] + AllocHGlobal,完全没问题,dev只占用了约200M+ 很可能是前面的语句导致的,试着注释掉一部分
整个程序占用内存很大,但我很奇怪的是为什么直接运行exe没有问题,vs运行就有问题。
秋的红果实 2016-08-23
  • 打赏
  • 举报
回复
非托管的需要手动释放内存, Marshal.FreeHGlobal(imgBuffer);
Poopaye 2016-08-23
  • 打赏
  • 举报
回复
试了下,写个new byte[18433024] + AllocHGlobal,完全没问题,dev只占用了约200M+ 很可能是前面的语句导致的,试着注释掉一部分
alexsun6 2016-08-23
  • 打赏
  • 举报
回复
引用 4 楼 shingoscar 的回复:
imgp.ImgHeight * imgp.ImgWidth * 2 这个是多少?
64位系统,imgp.ImgHeight 是3008,imgp.ImgWidth是3064。整个数据大小大概18M。 内存4G和8G是效果一样。 我很奇怪的一点是直接exe允许就没事。用vs调试允许就不行。
Poopaye 2016-08-23
  • 打赏
  • 举报
回复
imgp.ImgHeight * imgp.ImgWidth * 2 这个是多少?
Poopaye 2016-08-23
  • 打赏
  • 举报
回复
32位操作系统?
alexsun6 2016-08-23
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
需要加一条内存条
不管用,我试过了,加一个内存条和没加效果一样,都是直接运行就没事,用vs调试就崩溃在new byte[]上。
Poopaye 2016-08-23
  • 打赏
  • 举报
回复
需要加一条内存条

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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