Raku 的 NativeCall 运行 "LocalFree( )" 吗?

Does Raku's NativeCall run "LocalFree( )"?

Raku/Perl6、Windows 7 和 10

Raku 的 NativeCall 运行 "LocalFree( )" 是否在创建缓冲区后?还是我需要自己做? https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-localfree

非常感谢,-T

编辑:这是应 JJ 的要求。

https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regsetvalueexw

C++
    LSTATUS RegSetValueExW(
    HKEY        hKey,
    LPCWSTR     lpValueName,
    DWORD       Reserved,
    DWORD       dwType,
    const BYTE  *lpData,
    DWORD       cbData
  );

在汇编代码中:

 lea eax,[@@lMode]
 call RegSetValueExA,HKEY_CURRENT_USER,offset 
[@@VAL_Type],0,REG_DWORD,eax,DWORD

"offset [@@VAL_Type]" -> 指向键值字符串缓冲区的指针 "eax" -> 指向数据的指针(在缓冲区“@@lMode”中)

“*lpData”和“@@lMode”是内存中分配的 space 中的缓冲区。使用后,需要将其内存"LocalFree".

归还给系统

因此,换句话说我的问题,当 NativeCall 在内存中为缓冲区分配 space 时,它会在完成后返回 space,还是只是将它留在那里(内存泄漏)?

那么,我需要调用 "LocalFree()" 还是 NativeCall 会为我处理?

NativeCall 不会关闭任何 WinApi 调用缓冲区,因此您需要自己关闭。

如果你已经明白了...

  • NativeCall 所做的是调用 C 函数。 不是 NativeCall 的角色来分配或释放内存。

  • LocalFree 是一个 C 函数。从 Raku 调用 C 函数的正常方法是通过 NativeCall。

...那么您可以放心地忽略这个答案——以及这个答案所针对的问题,以及托德的答案。

如果您对上述内容有信心,那么也许这个答案会消除任何困惑并减少您被误导的机会。我在下面写的是悬而未决的。但是我觉得保证清晰是合适的。

Does Raku's NativeCall run “LocalFree( )”?

是的,如果你告诉它。

NativeCall 是通常用于从 Raku 调用 C 函数的功能。1

Does Raku's NativeCall run "LocalFree( )" after it creates buffers?

NativeCall 不会自行创建缓冲区。 NativeCall 所做的只是按照用户代码的指示调用 C 函数。

假设您使用 NativeCall 调用创建缓冲区的 C 函数。这是否意味着 NativeCall 创建了缓冲区?或者? (以类似的方式,如果在使用 NativeCall 调用创建缓冲区的 C 函数后使用 NativeCall 调用 LocalFree,是否意味着 Todd 的问题的答案是肯定的?如果不是,是否意味着答案是否定的? )

可以使用NativeCall来调用LocalFree,因为LocalFree是一个C函数,调用C函数正是NativeCall做某事时所做的事情。2

Or do I need to do it myself?

取决于您对上面几段带括号的问题的回答...

鉴于 NativeCall 不创建缓冲区,您不能需要做任何与 NativeCall 创建缓冲区相关的事情。

或者,如果 NativeCall 创建了缓冲区,那是因为你用它来手动调用创建缓冲区的 C 函数,因此你还需要手动调用 C 函数来释放如果你想释放这些缓冲区。

脚注

1 NativeCall 就是乐C FFI.

2 无论您 "use" NativeCall 是什么,您都会以 use NativeCall 语句开始。然后您通常会用它来调用 C 函数。您可能 use 它只是为了访问它定义的一些常量。