问题标签 [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 投票
0 回答
69 浏览

c# - 我可以将锁定的 .NET BitmapData.Scan0 传递给非托管 C++ 吗?

我想知道是否发送锁定的BitmapBitmapDataScan0字段到非托管 C++ 可能是一个问题。这是我的做法:

来自 C#.NET:

然后,使用 C++/CLI Wrapper(未包含在此示例中):

我没有使用 GCHandle,因为 BitmapData 将根据此源锁定到内存。我只需要读取位图,就可以更新 OpenGL 纹理。我无法直接从 C++ 访问图像。我可能可以使用 C++/CLI,但我没有看到明显的优势。

0 投票
1 回答
113 浏览

struct - PInvoke:CLR 编组器分配的内存何时释放?

当应用程序启动时,PInvoke 用于将以下结构从 VB.net 传递到非托管 C。当我逐步执行代码时,所有值都正确传递。在被调用的 C 方法中,我将 ptr 保存到传入的结构中。

在我将 ptr 保存到传入的结构后,一旦函数返回 VB.net,ptr 就会失效。

我怀疑在回调函数返回后,marshaller 分配的内存被释放了

有没有办法告诉编组器不要释放它在编组期间分配的内存?

感谢任何评论。谢谢

0 投票
2 回答
1180 浏览

c# - 使用 PInvoke 将句柄传递给托管对象的问题

我很困惑如何将句柄从.Net 传递给我的托管对象到非托管代码。现在我正在使用 C# 为 Oracle Siebel CRM 开发一种“驱动程序”。以及我如何面对如何将句柄传递给驱动程序 API 的问题有这样的方法:

我对最后一个参数 ISC_DRIVER_HANDLE* 句柄有问题。我想说它可能看起来很奇怪,但我没有 ISC_DRIVER_HANDLE 类型的定义。

据我所知,可以使用 GCHandle 来处理它......这是我关于如何实现它的愿景:

但是,在调用此方法后,我会遇到 CLR 崩溃:(对于跟踪量,我感到非常抱歉)

问题是:如何将句柄从.Net 传递给托管对象到非托管应用程序? ps 附加信息。缺乏信息是这里的主要问题。Oracle 提供的文档非常混乱且不完整。如果有人对已应用于信息检索的工作有疑问...这里是原始文档的链接https://docs.oracle.com/cd/E14004_01/books/PDF/SiebCTIAdm.pdf(从 260p 开始。 )。

但是我有一些大约 10 年前用 Delphi 编写的示例。我将从那里提供一些我认为可能有用的代码。1) 函数 CreateISCDriverInstance(在 TicISCCommunicationDriver 类中)

2)部分或TicISCCommunicationDriver定义:

3)构造函数:类函数TicISCCommunicationDriver.CreateInstance(const AParams: TISCNamedParamList): TicISCCommunicationDriver;如果未分配则开始(FInstance)然后 FInstance := TicISCCommunicationDriver.Create(AParams); 结果:= FInstance;结尾;

我从来没有在 Delphi 中开发过任何东西,但是,据我所知 - 它是在 Delphi 上实现的单例模式。FHandle:THandle它只是 TicISCCommunicationDriver 实例的句柄。在 Google 中搜索后,我发现 THandle 它是一个标识全局分配的动态内存对象的句柄。pps 我也尝试使用 HandleRef 找到解决方案,但它也没有帮助。

0 投票
0 回答
138 浏览

c# - 为什么在 C# 中访问非托管内存的成本偶尔会达到 120 毫秒?

我用来Marshal.AllocHGlobal在我的 C# 应用程序(在 Windows 中)中分配几个巨大的非托管内存块(每个 100MB)。我使用这些来分配较小的非托管内存。在对这些较小的分配进行基准测试后,我认识到虽然其中超过 99% 的成本为 0-10 个 C#StopWatch滴答,但有些成本为 30 毫秒到 120 毫秒,我可以将成本降低到单个memset调用(150 字节)。我用memset对内存区域中地址的两次内存写入替换了调用memset会触及并观察到相同的成本。这意味着我的内存访问成本是主内存访问成本的 1000 倍。由于页面错误似乎有类似的成本,我想知道页面错误是否会导致这种行为,但是查看 windows 任务管理器,当问题发生时,我的主内存容量还很远。

我试图在微基准测试中重现这一点,但没有成功。有没有人知道什么可能导致这种行为或者我可以做些什么来追捕它?

0 投票
0 回答
128 浏览

c# - 为什么托管堆的碎片会影响非托管堆分配请求的成功?

对于为什么在大型非托管分配之前调用 GC.Collect (在我的情况下,在创建大型(~250Mb)DirectX 资源之前)可以防止内存不足异常,我无法找到令人满意的解释。为什么托管堆的压缩允许非托管分配?

.Net 进程如何在托管堆和非托管堆之间共享其地址空间?

我最好的猜测是 .Net 进程在两种类型的堆和 GC 之间保持可移动的边界。Collect 允许该边界移动以支持更大的非托管堆。像这样的东西:

  • (M)托管分配
  • (U)n 托管分配
  • (F) 自由记忆
  • 进程地址空间 0-9

场景 #1 – 没有 GC.Collect

即将进行 3 个块的非托管分配,托管堆碎片化:

托管堆的“高水位标记”为 7

分配 3 个非托管块 -失败! 请注意,托管堆的高水位标记没有为非托管分配留下空间。

场景 #2 – 使用 GC.Collect

即将进行 3 个块的非托管分配,托管堆碎片化

托管堆的“高水位标记”为 7

调用 GC.Collect

托管堆的“高水位标记”为 3

分配 3 个非托管块 –成功!

这是它的工作原理吗?

0 投票
1 回答
391 浏览

c# - Marshal.FreeHGlobal如何释放无人阵列?

我使用以下方法保留了一个无人阵列:

然后使用以下方法释放它:

据我所知,这将正确释放内存并且不会发生内存泄漏。我的问题:这是真的吗?如果是,它是如何工作的?Marshal 状态是否已满并存储有关每个保留数据的元数据?

0 投票
0 回答
216 浏览

c# - 免费 IntPtr 到 IntPtr

我有课叫Parent

和班级孩子:

所有数据均未管理。

现在在主程序的某个地方,我有一个IntPtr指向Parent.

如果我尝试使用 Marshal.FreeHGlobalChilds 的真实数据释放此 Parent 将不会被释放。

问题:如何在不编写逐步释放代码的情况下挖掘它们并自动释放它们?

0 投票
2 回答
931 浏览

c# - 如何正确处理 PrivateFontCollection?

我正在使用 PrivateFontCollection 在我的网络服务器上安装上传的字体。下面的代码有效,但在第二次上传字体时,PrivateFontCollection 引用了上传的第一个字体。所以有些东西没有被正确处理。有人发现我做错了什么吗?

0 投票
1 回答
210 浏览

struct - f# NativePtr.stackalloc in Struct Constructor

我正在做一些 F# 性能测试,并试图在堆栈而不是堆上创建一个数组(值与引用类型)。我正在使用 NativePtr.stackalloc 在堆栈上分配内存。在下面的第一个构造函数中出现错误。

我可以简单地在函数中使用第二种方法,但是为什么我不能在构造函数中分配内存真的很困扰我。

0 投票
1 回答
205 浏览

f# - F# NativePtr.stackalloc 意外堆栈溢出

仍在进行我的 F# 性能测试并尝试使基于堆栈的数组正常工作。有关更多背景信息,请参见此处:f# NativePtr.stackalloc in Struct Constructor

据我了解,每个函数调用都应该在堆栈中获得自己的框架。然后在返回时通过将堆栈指针移回来释放此内存。然而,下面会导致堆栈溢出错误 - 不确定为什么在函数内部执行 stackalloc。

有趣的是,这只发生在发布模式下,而不是调试模式下。

我相信 dotnet 中的标准堆栈大小是 1MB,我还没有调整我的。我希望分配 8192 个整数(32768 字节)不会破坏堆栈。

更新 按照 Fyodor Soikin 的建议使用 ILSpy 进行反编译后,我们可以看到在优化期间发生了内联。有点酷,有点吓人!

除此之外,可能会感兴趣以下内容:

http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx

也可以使用属性调整优化:

https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions(v=vs.110).aspx?cs-save-lang=1&cs-lang=fsharp#code-snippet-1