问题标签 [unmanaged-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
15532 浏览

.net - 如何将 Marshal.AllocHGlobal 分配的内存清零?

我正在通过Marshal.AllocHGlobal. 然后,我将一组字节复制到该位置,并将生成的内存段转换为 a struct,然后再通过Marshal.FreeHGlobal.

这是方法:

这在大多数情况下都有效,但是如果我的字节数少于所需的大小struct,则将“随机”值分配给最后一个字段(我LayoutKind.Sequential在目标结构上使用)。我想尽可能有效地将这些悬挂区域归零。

就上下文而言,此代码正在反序列化从 Linux 上的 C++ 发送的高频多播消息。

这是一个失败的测试用例:

重复运行此测试会导致第二个断言每次失败并显示不同的值。


编辑

最后,我使用了leppie 的建议 gounsafe and using stackalloc。这分配了一个根据需要清零的字节数组,并将吞吐量从 50% 提高到 100%,具体取决于消息大小(更大的消息会带来更大的好处)。

最后的方法最终类似于:

不幸的是,这仍然需要调用Marshal.PtrToStructure将字节转换为目标类型。

0 投票
1 回答
1274 浏览

c# - 如何在 C# 中直接将托管流读入 uint 数组?

我在流中有一些数据,实际上是 uint 格式。System.IO.Stream 只允许我将内容读取到字节数组中,但我不想读取字节然后将它们转换为字节数组长度的 1/4 的 uint 数组。我想将它直接读入 uint 数组的内存中,这样可以节省时间。

如果它在非托管 C++ 中,那就太容易了。只需将指针发送到 uint 数组即可。但在 C# 中,它似乎并不那么简单。我正在尝试生成一个与另一个 uint 数组具有相同内存地址的字节数组,然后将字节数组作为 Stream.Read() 的参数发送,这样当 Stream.Read() 写入字节数组时,内容就是在 uint 数组中也是如此。但是我查看了 Marshall 课程,到目前为止还没有找到解决这个问题的方法。有任何想法吗?

0 投票
2 回答
160 浏览

c# - 特定于系统的错误搜索?

我最近一直在搞乱SFML,一个多媒体库。我使用 C#,所以我很自然地选择了 .Net 绑定,您可以从最新 2.0 版本的 SVN 中获取该绑定。搞砸了一段时间后,我注意到我的应用程序有时会在使用 Text 对象时挂起,这是一个用于绘制纹理字体的对象。

通过使用分析器和全能的 Windows 任务管理器进行的进一步调查显示,使用 Text 的简单应用程序似乎以某种方式泄漏了内存。然后我在 SFML 论坛上发表了一个关于它的帖子(主题)。但是,SFML 的主要开发人员无法在他的机器上重现该错误。我想我不可能疯了,我把它发给了一个朋友,他报告说他确实看到了它的发生。

我为 SFML 的开发者 Laurent 做了一个例子,但他仍然无法重现这个错误。考虑到这可能与操作系统有关,我将文件发送给我能找到的每个人,并询问他们的操作系统。这是我的结果:

http://spreadsheets.google.com/ccc?key=0AhcHeJlLGEVUdG1TTi1mTkFxeFlHYVRISXhjbFBDUmc&hl=en

如您所见,Turc 和 K7 都具有相同的操作系统,但它不会在 K7 上崩溃(该表不完整,测试候选人尚未报告)。无论如何,这告诉我这显然不是操作系统问题。

所以我的实际问题是,除了操作系统或架构之外,还有哪些其他因素会影响此类仅出现在某些系统上的错误?

供参考,这里是我发给朋友的文件:http: //dl.dropbox.com/u/3310651/MemLeak2.rar

以及我所做的分析截图:http: //dl.dropbox.com/u/3310651/sfml_memleak.png

谢谢!

0 投票
2 回答
595 浏览

c# - C#/.NET:用于网络的 UnmanagedMemoryStream?

我正在考虑使用UnmanagedMemoryStream而不是 MemoryStream 来处理网络服务器中的传入(可能还有传出?)数据包。我希望实现的是减少对值的复制,如果可能的话,避免复制到堆中(太多)。

例如,对于传入的数据包,可以执行以下操作:

不过,我不太确定这样做是否有任何实际的好处。任何人都可以就这样做是否有任何价值提供一些反馈,而不是使用良好的旧托管 MemoryStream?

提前致谢。

0 投票
1 回答
1307 浏览

pointers - 将非托管指针传递给 C++/CLI 中托管类中的非托管对象

让我们假设以下情况:

我想将指向在 C++/CLI 代码中分配(并填充)的 std::vector 的指针传递给非托管 C++。如果我只是简单地写a->AnotherMethod(b),那么向量在非托管代码中是空的(例如 C++/CLI 中的 4 个元素和传递给a.

这样做的正确方法是什么?

0 投票
2 回答
235 浏览

c# - _msize() 在托管数据数组上?

有一个本机函数,它采用指向数据数组的指针数组,例如用 malloc 分配的 char。

在托管代码中,我枚举了要通过 PInvoke 传递给该函数的 byte[] 数组

然而,本机代码中的 _msize 调用会导致堆损坏。我记得我将 stackalloc 与一维数组 char* 和串联的 byte[] 数组一起使用。但我需要支持具有不同大小的单个字节 [] 数组的“锯齿状数组”,因此需要指针数组 char**。

如何固定 byte[] 数组以使 _msize 像在 stackalloc 情况下一样正确工作?

0 投票
2 回答
289 浏览

c# - 创建实例时如何在系统中分配非托管内存?

从 C# 创建 COM 对象或任何其他非托管实例时,如何在系统中分配非托管内存?

0 投票
2 回答
829 浏览

functional-programming - 有没有没有垃圾收集的函数式语言

甚至是非功能/非内存管理语言中的重功能样式。有什么样的技术来处理像中间垃圾这样的问题?在lazynizes/thunk 分配的内存之后进行清理。性能(因为如果您必须跟踪其进度以释放它(智能指针?)

0 投票
1 回答
826 浏览

.net - 非托管组件用于分配/解除分配的内存区域

假设 .net 托管应用程序通过 InterOP 与非托管组件交互。如果我必须调试内存问题;非托管组件究竟在哪里分配内存?它是 GC 使用的同一个堆(我怀疑)还是其他一些区域?我正在做 Windbg 调试,想知道我是否可以通过像 !dumpheap 这样的 SoS 命令查看非托管组件的分配?

0 投票
1 回答
872 浏览

c# - 通过activex组件dynavis在.net中的非托管内存泄漏

我使用的 ActiveX 组件最初仅用于 .Net 之前的日子,这会导致内存泄漏。所有 .Net 相关实例(AxHost 等)都已正确释放,但非托管内存仍在不断增长。(根据.Net mem profiler)

有没有办法从.Net 中强制释放非托管内存?也许这可以通过处理不守规矩的 ActiveX 组件的方式来解决?

组件是 Dynavix 2(dyDisplay、PictureDocument、AxDYNAview)。