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

c# - 在 C# 中处理非托管内存

我在 c# 中使用本机 C++ dll,如下所示:

C++ 函数:

在 c# 中,我正在做:

(这是适当地使用不安全和固定的块来完成的,所以不用担心)

现在,如果我从 打印数据f2,我会得到一些损坏的数据,垃圾值。有些值是正确的。我想知道,是因为将其保存在 void 指针中ptr吗?还是那很好,原因是别的?

0 投票
1 回答
429 浏览

c# - 两个不同的 GCHandle 引用内存中的同一个数组

这可能不是一个措辞恰当的问题,因为我不确定发生了什么,所以我不知道如何有针对性地问它。我正在努力学习,我希望我能在这方面得到一些指导。感谢您对新手的耐心。

我有一段代码正在修改。它显示图像。我想修改图像,并将其显示在不同的窗口中。我复制显示图像的代码,进行修改,然后它显示原始图像和修改后的图像的修改后的图像。

似乎 GCHandle 一直在引用相同的内存?我不是真的通过更改手柄名称来制作新手柄吗?很抱歉这段代码很长,但我迷路了。

出了什么问题?

最令人困惑的是它正在工作,然后我改变了一些东西,现在无法回到工作版本,虽然我认为我的代码与工作的代码相同。一些设置一些在哪里?

0 投票
1 回答
913 浏览

c# - 在 C# 库和 C++ (CLR) 之间传递对象

如何将对象从 C# 库传递到 C++。

我可以调用一个返回voidint 没有任何问题的函数。

现在考虑 C# 中的以下函数,

我的 C# 类包含的位置,

现在,我想在我的 C++ 中使用这个列表。所以我创造了,

方法对吗??如果不是我需要在 C++ 中使用什么?

0 投票
0 回答
2875 浏览

c# - C#中的WinDivert

我想在 C# 代码中调用 5 个 WinDivert 函数,首先反射:PInvoke 这里是签名:

我已经设法避免在调用 时出现 ( ) 、87 = ERROR_INVALID_PARAMETER( 998 = ERROR_NOACCESS) 错误WinDivertOpen(),但我仍然在尝试调用.WinDivertClose()WinDivertRecv()System.AccessViolationException : Attempted to read or write protected memory. This is often an indication that other memory has been corrupted(998 = ERROR_NOACCESS)WinDivertHelperParsePacket()

这是代码:

我的老板告诉我,用 C++ 编写一个包装 C 调用并将其公开给 C# 的 COM 对象会更好/更容易,以避免编组和内存处理的痛苦。我应该坚持使用 PInvoke 还是采用 COM 方式?

编辑:更新

我尝试了两种不同的分配非托管内存的方法,但都失败了(允许不安全的代码):

和 :

有时在一个循环中,WinDivRecv 失败并显示 LastWin32Error :6 = INVALID_HANDLE_VALUE是因为 GC 弄乱了句柄吗?我试过GC.KeepAlive(handle)了,它没有改变任何东西。

C++\CLI 包装器:(非托管 C DLL 和托管 C# 代码之间的桥梁)

[以下评论中的建议选项]

我按照以下步骤操作:

  1. 创建 C++/CLI 库项目
  2. 创建一个封装 C 函数的 Native C++ 类
  3. 创建一个托管 C++/CLI 类,其字段指向本机类实例,并包装所有非托管方法并进行必要的编组。
  4. 尝试构建 ==> 使用著名的 LNK2019 和 LNK2028 失败

我应该添加 WinDivert DLL 作为参考还是只添加 WinDivert.h ?内核驱动程序 .sys 文件呢?老实说,它并不比 PInvoke 容易,但更糟糕的是,我仍然必须对非 blittable 数据类型和结构/枚举定义进行相同的编组!

0 投票
1 回答
1349 浏览

windows - Windbg !heap -s 和 !heap -stat 命令在输出上不一致

我有一个内存转储。在这个转储中,我有一个带有句柄的堆fd00000。这是命令输出的摘录!heap -s fd00000

您会看到它按预期显示了摘要信息。但输出!heap -stat -h 0fd00000 显示如下:

它都是十六进制的,所以从这里我看到“总繁忙字节”超过 205 MBytes。所以你看到这!heap -s告诉我这个堆有 80 MB/60 MB 的保留/虚拟内存,而!heap -stat告诉我这个堆占用 205 MB。差距如此之大。这怎么可能?当我运行时,!heap -s我看到多个这样的条目:

也许这就是原因?

0 投票
1 回答
112 浏览

c# - 新图像覆盖以前的位图

有很多关于这个的帖子,但我仍然无法弄清楚。我对此很陌生,所以请原谅。

我显示一个图像,然后抓取一个新图像,并尝试显示它。当显示新图像时,它具有旧图像的残余。我试过Picture1.Image= null无济于事。

托管内存有问题吗?我怀疑这与内存的管理方式有关,即代码以某种方式将新图像复制到旧图像上,从而留下前一个图像中的一些数据。

这是显示数据的代码scaled1(来自这个有用的早期帖子):

编辑: 添加的代码显示处理绘制的数组。如果使用该Array.Clear方法清除数组,则覆盖行为停止。也许当这被清除后,我可以发布一个规范的片段来展示这个问题。

这将问题重置为:为什么在重写数组的每个值时需要清除数组?数组如何保留先前值的信息?

0 投票
1 回答
1699 浏览

c# - Marshal.StructureToPtr 没有装箱

有没有办法将结构(可能存储在TypedReference中)编组到非托管内存而不实际装箱?结构的类型在运行时是未知的,所以我不能使用 StructureToPtr (.NET 4.5.1) 的泛型重载。我可以获得StructureToPtr重载的 MethodInfo ,但似乎没有一种方法可以通过泛型引用或TypedReference来调用它。

编辑:通用的StructureToPtr仍然将结构装箱,因此尝试调用它是无用的。

0 投票
0 回答
247 浏览

c# - 如何使用 C#.net 中的非托管 C/C++ 管理内存?

需要一些专家建议:

我有一个来自 C/C++ 上的第 3 方提供商的非托管代码,我正在从 C#.Net 编写一个包装器以获取引用并使用相应的方法。由于它是非托管的,并且有很多地方存在内存泄漏,并且不知道非托管代码来管理内存,这种情况的最佳解决方案是什么?

我有 PInvoke 和 Marshalling 的解决方案,它通过了解内存管理的知识来连接托管和非托管。但是 GC 会完全解决这个问题,还是仍然存在应该释放内存的间隙?.Net 包装器类是否有解决方案我有一种通用的方法来管理非托管调用的内存?

0 投票
1 回答
228 浏览

c# - 从 c# 中使用 c++

我目前有一些 c++ 代码,它处理 'char ***myArray' 的速度比任何其他用于字符串比较的方法都要快得多。

我还将我的 c++ 包装到一个 DLL 中,并从使用“DataTable”的 C# GUI 调用函数。

我很好奇如何将我的“DataTable”数据传递给我的“char ***myArray”。

接口.cs:

cppFunctions.cpp:

如果我通过它传递 int、double、string 或任何简单值就可以了。

0 投票
0 回答
171 浏览

c# - 指向非托管 DLL 文件流的指针

我有一个第 3 方非托管 DLL,它希望我向它们提供指向一个巨大的连续内存块(大约 500 MB)的指针(需要一个 IntPtr)。虽然它不超过我们可以使用的内存量,但通常无法在不出错的情况下获得这么大的连续内存块。这个内存块只是一个图像缓冲区,虽然如果我尝试为其提供一个较小的块并且它消耗它并崩溃它不太可能消耗所有它。另请注意,大量内存是设备支持的最大容量,但设备在任何给定时间所需的内存量取决于用户对设备的操作。

第 3 方不愿意对其 DLL 进行任何更改。我问他们是否愿意只采用文件路径并让 DLL 将数据转储到硬盘驱动器上的原始文件中。

无论如何,我不知道如何表达我正在寻找的内容,我怀疑它甚至可能,但我正在寻找某种传递 IntPtr 的方法,而不是指向一个连续的内存块指向一个文件流或直接进入硬盘驱动器上的文件的东西。这样的事情可能吗?如果是这样,我需要查看什么样的 .Net 命名空间。