NativeCall Раку выполняет "LocalFree ()"? - PullRequest
0 голосов
/ 07 января 2020

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 "- это буферы в выделенном пространстве в памяти. После их использования их память должна быть возвращена системе с «LocalFree».

Итак, перефразируя мой вопрос, когда NativeCall выделяет место в памяти для буферов, он, следовательно, возвращает пространство после того, как это покончил с этим, или он просто оставил его там (утечка памяти)?

Итак, мне нужно вызвать «LocalFree ()» или NativeCall позаботится обо мне?

Ответы [ 2 ]

1 голос
/ 10 января 2020

Если вы уже понимаете, что ...

  • То, что делает NativeCall, вызывает C функций. Это , а не Роль NativeCall в выделении или освобождении памяти.

  • LocalFree - это функция C. Обычный способ вызова функции C из Raku - через NativeCall.

... тогда вы можете спокойно проигнорировать этот ответ - и вопрос, на который это ответ, и ответ Тодда.

Если вы не уверены в вышесказанном, то, возможно, этот ответ устранит любую путаницу и снизит вероятность того, что вы введены в заблуждение. Ниже я пишу pendati c. Но я считаю, что необходимо обеспечить ясность.

Запускает ли Raku NativeCall «LocalFree ()»?

Да, если вы скажете это.

NativeCall - это функция, обычно используемая для вызова C функций из Raku. 1

Запускает ли Raku NativeCall "LocalFree ()" после создания буферов?

NativeCall не создает собственные буферы. Все, что делает NativeCall, это вызывает C функции в соответствии с инструкциями пользовательского кода.

Допустим, вы используете NativeCall для вызова функции C, которая создает буфер. Означает ли это, что NativeCall создал буфер? Или ты ? (Аналогичным образом, если кто-то использует NativeCall для вызова LocalFree после того, как он использует NativeCall для вызова функции C, которая создает буферы, означает ли это ответ на вопрос Тодда «Да»? А если нет, значит ли это, что ответ Нет?)

Вы можете использовать NativeCall для вызова LocalFree, потому что LocalFree - это функция C, а вызов функций C - это именно то, что делает NativeCall, когда вы используете ее для выполнения. что-то. 2

Или мне нужно сделать это самому?

В зависимости от вашего ответа на вопросы в скобках пару абзацев выше .. .

Учитывая, что NativeCall не создает буферы, вы не можете делать что-либо, связанное с созданием буферов NativeCall.

В альтернативном варианте, если NativeCall создает буферы, это потому, что вы использовали его для ручного вызова C функций, которые создают буферы , и поэтому вам также необходимо вручную вызывать C функции для освобождения этих буферов, если вы хотите их освободили.

Сноски

1 NativeCall - это раку C FFI .

2 Независимо от того, что вы «используете» NativeCall, вы начнете с use NativeCall оператора. Тогда вы обычно используете его для вызова C функций. Возможно, вы могли бы use получить доступ только к некоторым константам, которые он определяет.

0 голосов
/ 09 января 2020

NativeCall не закрывает буферы вызовов WinApi, поэтому вам нужно сделать это самостоятельно.

...