问题标签 [pin-ptr]

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 投票
2 回答
81 浏览

object - 如何保存对象,使其不会被 C++/CX 中的 GC 收集

这是我为构造函数提供的代码:

现在我想将“impl”保存在某个地方,这就是为什么我将它保存在 X 中,我将在函数结束时返回。但是一旦这个函数结束,GC 就会调用这个对象的解构器。当它被调用时,如何设置这个对象被 GC 避免?

编辑:在互联网上搜索数小时后,我注意到 c++ 有一个叫做固定指针(pin_ptr)的东西,但我在上面找到的所有示例都显示了在内部保存 int 数组。是否可以将对象保存在固定指针中?

0 投票
0 回答
249 浏览

c++-cli - 将 C++/CLI 用户定义对象 (%) 转换为原生 C++ 对象 (&)

如何将 (%) 传递的用户定义对象转换为本机对象 (&)。例如

因此,在上面的示例中,我想将托管对象传递%m_obj_unmanaged_func. 这里的 user_defined_managed_obj 是 C++/CLI 中的 .net 包装器,它是原生 C++ 的桥梁。

我尝试了以下方法:

有人会指出我正确的方向或让我知道我能做些什么来解决这个问题。谢谢你。

编辑:user_defined_unmanaged_obj是本机 C++ 对象,user_defined_managed_obj是它的包装 C++/CLI 类。

编辑:以下是本机 C++ 中的代码,native_sql.h

在本机 C++ 中,native_upload_specific_data.h

在 C++/CLI 中,sql_wrapper.h

在 C++/CLI 包装器中,upload_specific_data_wrapper.h

我收到的错误是

....谢谢。

0 投票
2 回答
578 浏览

c# - 使用 CLI 数组分配的内存作为非托管类的存储空间

我有一个非托管类,它接受指向内存的指针作为其存储空间。

例如

现在我正在尝试包装这个类以便在 C# 中使用。显然,我希望能够将类似 a 的东西传递float[]给班级。显而易见的事情是cli::pin_ptr从包装类中使用。

但是,固定 ptr 仅在 cli::pin_ptr 在范围内时才有效。构造函数退出的那一刻,我不能再保证 C++ 类拥有的内存块是真实的。

有没有办法在类的生命周期内固定一个指针?我做了很多搜索,只找到了一种使用“GCHandle”的方法,该方法似乎纯粹用于托管 C++(即不是 C++/CLI)。有人可以指出我确定性地固定和取消固定指针的方法吗?

0 投票
1 回答
243 浏览

c++-cli - C++/CLI 方法调用本机方法来修改 int - 需要 pin_ptr?

我有一个 C++/CLI 方法,ManagedMethod带有一个输出参数,该参数将由本机方法修改,如下所示:

ManagedMethod返回后, 的值n已按我的预期进行了修改。到目前为止,我能够编译它的唯一方法是使用pin_ptrinside ManagedMethod,那么实际上 pinning 是正确/唯一的方法吗?还是有更优雅的传递n方式NativeMethod

0 投票
1 回答
1773 浏览

c++-cli - C++/CLI pin_ptr的正确使用方法

我是 C++/CLI 的新手。
我已经知道 pin_ptr 的功能是让 GC 不学习指定对象。

现在让我给你看msdn的例子。
https://msdn.microsoft.com/en-us//library/1dz8byfh.aspx

听到的是问题。

没关系,传递的对象(arr)没有固定?因为非托管代码(native_function)是同步操作并在 C++/CLI 代码(加载)之前完成

即使主要逻辑正在运行,gc destory arr 是否还有机会?(我认为 A 是 main 的堆栈变量,而 arr 是 A 的成员变量,所以在运行 main 时,它应该是可见的)

如果是这样,我们如何保证 A 在调用负载之前就在那里?
(仅当不在本机代码中运行时?)

提前致谢。

0 投票
1 回答
660 浏览

c++ - 是否有必要释放 pin_ptr 还是自动完成?

我阅读了有关的 microsoft文档pin_ptr,但我不清楚它是否自动发布。任何人都可以解释一下吗?

0 投票
1 回答
138 浏览

c++ - 管理到本机值类转换:转换指针是否安全?

我有一个 C# 项目,它使用库中的 C++ 类。C# 类实际上是 C++ 类的包装器,它们将 C++ 功能暴露给 C# 客户端代码。在许多地方,C++ 值类被转换为 C# 包装器并向后转换。在代码审查期间,我发现了两种转换类的方法:通过 reinterpret_cast(参见 operator *)和通过 pin_ptr(参见 MultiplyBy);如您所见,本机类和托管类都有三个“双”字段,这就是有人使用 reinterpret_cast 的原因;

在许多地方,使用 memcpy 将类从 C# 复制到 C++:memcpy(&NativePointInstance, &ManagedPointIntance, sizeof(double)*3);

我从一位开发人员那里听说,当我们使用 C# 值类时,reinterpret_cast 在某些情况下是安全的。

问题是:什么时候在 C# 值类上使用 reinterpret_cast 是安全的,什么时候不安全?在这种情况下,转换指针的最正确方法是什么——比如在运算符 * 中或在 MultiplyBy 中,或其他替代方法?

有人可以详细解释 MultiplyBy() 中发生了什么,这些技巧是如何工作的吗?

据我了解,该问题可能是由于优化器可能会更改字段顺序,GC 可能会重新组织堆,并且托管代码和本机代码之间的字段对齐方式可能不同。