问题标签 [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.
performance - pin_ptr performance relative to native (VC) heap objects
In a C# to native lib CLI/C++ wrapper, I have a choice:
- Store native pointer in a managed class (native object is created using native "new")
or
- Store native object as a data blob in a managed class' field, and use
pin_ptr
to pin it before each native use.
Has anyone done any comparative analysis on the relative performance costs of the two paths?
Thanks!
list - 如何将 pin_ptr 放入通用列表中?
我有一个托管 C++ 方法,该方法将 String^ 列表作为参数
该方法需要使用指向字符串^中内存的指针填充非托管结构
使用 PtrToStringChars 提取 WCHAR* 非常简单
但是我不知道在设计时要分配的 pin_ptr 的数量
我想将固定的 ptr 添加到列表中,类似于下面的 List< pin_ptr< const wchar_t>>
这样做会产生错误 C3225:“T”的泛型类型参数不能是“cli::pin_ptr”,它必须是值类型或引用句柄
有没有办法做到这一点?在托管 C++ 中
string - 我需要 pin_ptr 来传递文字字符串吗?
从托管 c++ 函数中,我想调用一个非托管函数,该函数需要一个 'const char *' 作为参数。
下面的 a) 和 b) 是否正确?对于 b),我需要 pin_ptr 'hello' 吗?a) 呢?谢谢。
一种)
myFunction( "hello" );
b)
memory - pin_ptr 原生 void* 帮助
设置
我有一个 PDF API,它具有下面定义的本机函数。
如果我在我的 C++/CLI 包装函数中调用上述代码,它会返回正确的字符串,但在我调用 PDF_CloseDoc 时会引发 AccessViolationException。哎呀。我忘了 pin_ptr 指向文档的指针。
问题
当我 pin_ptr pdoc 时,我可以成功调用这些本机函数,但是当 PDF_GetMetaText 返回时缓冲区不再包含我的字符串。
我也尝试过固定缓冲区[0],但这会导致 GetMetaText 出现访问冲突异常。
问题
我不能说 GetMetaText 中发生了什么,所以我不确定 pdoc 发生了什么。对上述代码有什么建议吗?
visual-c++ - vc++中的pin_ptr和interior_ptr
我正在开发一个项目,该项目是由以前在 Visual c++ 2008 中工作的人编写的(STM32 的 HID 接口)。所以为了模仿导致问题的行,我在 VC++ 2008 中创建了一个示例 winform 应用程序。这里是仅当为 x64 构建时,这一行的单击事件才会产生构建错误,但 win32 构建不会产生任何构建错误并且工作正常。
并且仅针对 x64 构建出现的构建错误是:
谢谢。
c++-cli - 使用 pin_ptr 时访问冲突?
当我使用 pin_ptr 在本机 c 代码中传递数组时,我遇到访问冲突。代码如下:
当我更改此代码以分配新空间并将原始数组复制到该代码时,我没有遇到访问冲突。新代码:
问题:我使用 from pin_ptr 有什么问题吗?
pointers - internal_ptr pin_ptr 的问题
我正在尝试构建一个 cli/c++ ref 类。此类的目的是包装具有某些功能的本机类指针。本机类指针由黑盒工厂方法提供给我。对于我的生活,我无法弄清楚如何固定本机指针使其不动。这是代码中的场景(可以这么说):
我不断收到:错误 C2440:'=':无法从 'cli::pin_ptr' 转换为 'NativeFooClass*'
我以为编译器对待它们是一样的?我需要静态转换吗?好像不对???
我试图固定这个指针的原因是因为当我尝试在一个方法中使用它,然后从 C# 调用这个方法时,我得到一个 AccessViolation 运行时错误“{”试图读取或写入受保护的内存。这通常表明其他内存已损坏。"}"
arrays - 复制数组时无用的pin_ptr
我有一些遗留代码,它们将本机数组复制到托管数组中:
我无法重构它,Runtime::InteropServices::Marshal::Copy
因为原始数组是双精度的,而目标是浮点数。
我的问题是我不明白为什么 pin_ptr。我不认为这是必要的,但它是一段关键的代码,我想在删除它之前确定。
您认为删除它是否安全?
string - pin_ptr & PtrToStringChars vs. StringToHGlobalAnsi:为什么 PtrToStringChars var 失去了它的价值?
我正在使用 C++/CLI,我想WNetAddConnection2
从 Windows Networking 调用该函数。
首先,我知道 C++/CLI 不是我工作的首选语言,但我现在无法更改它,例如改用 C#。
现在的问题是,这个函数需要 wchar_t*,所以我需要将 System::String^ 转换为 wchar_t*。
解决方案 1):使用pin_ptr
和PtrToSTringChars
从vcclr.h
解决方案 2):使用StringToHGlobalUni
. (标题提到StringHToGlobalAnsi
是因为更多的人正在搜索它,所以他们可能会找到这篇文章并且它的答案更快)。
我发现这两种解决方案都有效。但是#1并非如此。我已将 WNet 函数放入CWNetShare
具有以下构造函数的 ref 类中:
其中m_wszLocalDrive
是 type 的私有CWNetShare
成员wchar_t*
。
真正的问题:m_oWNetShare = gcnew CWNetShare
从 Winform 类构造函数(我知道,C++/CLI 和 Winforms ......)调用构造函数时,一切似乎都很好。字符串i_sLocalDrive
和其他字符串已正确转换和分配。但是m_oWNetShare
稍后访问时,所有 m_wsz... 变量中的值都会丢失。看起来对象被 GC 移动了。
因此我做了一个测试:
m_oManaged = gcnew CManaged;
再次在其构造函数中添加一个 winform 。以后访问m_oManaged的时候,如果m_oManaged没有被移动,m_wszPinned
就可以了。
但是在GCing之后,它显示出胡说八道。但是 m_wsznothing 保持它的价值,所以这不是问题wchar_t*
,而是 pin_ptr 的问题。的地址m_oManaged
变了,但是地址m_wszPinned
还是一样的,那为什么值会丢失呢?
这里出了什么问题?
那么 pin_ptr 和 PtrToSTringChars 还有用吗?
我现在正在使用编组,这很有效。
c++-cli - cli::数组作为混合班的成员
我想拥有一个托管缓冲区作为混合类的成员:
这导致:
错误 C3265:无法在非托管“A”中声明托管“m_managedBuffer”
所以我尝试使用 auto_gcroot:
并得到以下错误:
错误 C2106:“=”:左操作数必须是左值
我的解决方案是使用托管包装器
我不喜欢这样,因为它引入了一个间接级别来访问实际缓冲区,此外,当我想固定托管缓冲区(pin_ptr)时 - 我该怎么做?我可以只固定内部 m_bytes 成员而不固定外部 ByteArray 对象吗?
解决方案:使用 gcroot 代替 auto_gcroot。托管字节数组将被 GC 清理,不必在 auto_gcroot 下。