问题标签 [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.
.net - 如何将 Marshal.AllocHGlobal 分配的内存清零?
我正在通过Marshal.AllocHGlobal
. 然后,我将一组字节复制到该位置,并将生成的内存段转换为 a struct
,然后再通过Marshal.FreeHGlobal
.
这是方法:
这在大多数情况下都有效,但是如果我的字节数少于所需的大小struct
,则将“随机”值分配给最后一个字段(我LayoutKind.Sequential
在目标结构上使用)。我想尽可能有效地将这些悬挂区域归零。
就上下文而言,此代码正在反序列化从 Linux 上的 C++ 发送的高频多播消息。
这是一个失败的测试用例:
重复运行此测试会导致第二个断言每次失败并显示不同的值。
编辑
最后,我使用了leppie 的建议 gounsafe
and using stackalloc
。这分配了一个根据需要清零的字节数组,并将吞吐量从 50% 提高到 100%,具体取决于消息大小(更大的消息会带来更大的好处)。
最后的方法最终类似于:
不幸的是,这仍然需要调用Marshal.PtrToStructure
将字节转换为目标类型。
c# - 如何在 C# 中直接将托管流读入 uint 数组?
我在流中有一些数据,实际上是 uint 格式。System.IO.Stream 只允许我将内容读取到字节数组中,但我不想读取字节然后将它们转换为字节数组长度的 1/4 的 uint 数组。我想将它直接读入 uint 数组的内存中,这样可以节省时间。
如果它在非托管 C++ 中,那就太容易了。只需将指针发送到 uint 数组即可。但在 C# 中,它似乎并不那么简单。我正在尝试生成一个与另一个 uint 数组具有相同内存地址的字节数组,然后将字节数组作为 Stream.Read() 的参数发送,这样当 Stream.Read() 写入字节数组时,内容就是在 uint 数组中也是如此。但是我查看了 Marshall 课程,到目前为止还没有找到解决这个问题的方法。有任何想法吗?
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
谢谢!
c# - C#/.NET:用于网络的 UnmanagedMemoryStream?
我正在考虑使用UnmanagedMemoryStream而不是 MemoryStream 来处理网络服务器中的传入(可能还有传出?)数据包。我希望实现的是减少对值的复制,如果可能的话,避免复制到堆中(太多)。
例如,对于传入的数据包,可以执行以下操作:
不过,我不太确定这样做是否有任何实际的好处。任何人都可以就这样做是否有任何价值提供一些反馈,而不是使用良好的旧托管 MemoryStream?
提前致谢。
pointers - 将非托管指针传递给 C++/CLI 中托管类中的非托管对象
让我们假设以下情况:
和
我想将指向在 C++/CLI 代码中分配(并填充)的 std::vector 的指针传递给非托管 C++。如果我只是简单地写a->AnotherMethod(b)
,那么向量在非托管代码中是空的(例如 C++/CLI 中的 4 个元素和传递给a
.
这样做的正确方法是什么?
c# - _msize() 在托管数据数组上?
有一个本机函数,它采用指向数据数组的指针数组,例如用 malloc 分配的 char。
在托管代码中,我枚举了要通过 PInvoke 传递给该函数的 byte[] 数组
然而,本机代码中的 _msize 调用会导致堆损坏。我记得我将 stackalloc 与一维数组 char* 和串联的 byte[] 数组一起使用。但我需要支持具有不同大小的单个字节 [] 数组的“锯齿状数组”,因此需要指针数组 char**。
如何固定 byte[] 数组以使 _msize 像在 stackalloc 情况下一样正确工作?
c# - 创建实例时如何在系统中分配非托管内存?
从 C# 创建 COM 对象或任何其他非托管实例时,如何在系统中分配非托管内存?
functional-programming - 有没有没有垃圾收集的函数式语言
甚至是非功能/非内存管理语言中的重功能样式。有什么样的技术来处理像中间垃圾这样的问题?在lazynizes/thunk 分配的内存之后进行清理。性能(因为如果您必须跟踪其进度以释放它(智能指针?)
.net - 非托管组件用于分配/解除分配的内存区域
假设 .net 托管应用程序通过 InterOP 与非托管组件交互。如果我必须调试内存问题;非托管组件究竟在哪里分配内存?它是 GC 使用的同一个堆(我怀疑)还是其他一些区域?我正在做 Windbg 调试,想知道我是否可以通过像 !dumpheap 这样的 SoS 命令查看非托管组件的分配?
c# - 通过activex组件dynavis在.net中的非托管内存泄漏
我使用的 ActiveX 组件最初仅用于 .Net 之前的日子,这会导致内存泄漏。所有 .Net 相关实例(AxHost 等)都已正确释放,但非托管内存仍在不断增长。(根据.Net mem profiler)
有没有办法从.Net 中强制释放非托管内存?也许这可以通过处理不守规矩的 ActiveX 组件的方式来解决?
组件是 Dynavix 2(dyDisplay、PictureDocument、AxDYNAview)。