PHP FFI - 如何释放由 FFI::new("void*[2]", false, true) 创建的内存

问题描述 投票:0回答:1

我正在使用 php FFI 调用 C++ dll,C++ 函数的签名是:

int Do(int methid, int paramlen, void *param[], int cbparam[]);

在C++中,我可以通过

调用这个函数
char* param1 = (char*)"test";
int param2 = 2;
void *param[2] = {(void*)param1, (void*)(unsigned long long)param2};
int cbparam[2] = {0, 0};
Do(1, 2, param, cbparam);

在PHP中,我通过PHP FFI调用这个函数:

$param = $ffi->new("void*[2]", false, true);
$cbparam = $ffi->new("int[2]", false, true);  
$cstr = "test\0";

$param[0] = $ffi->new("char[" . strlen($cstr) . "]", false, true);
FFI::memcpy($param[0], $cstr, strlen($cstr));
$cbparam[0] = 0;

$param2 = 2;
$param[1] = $ffi->cast("void*", $param2);
$cbparam[1] = 0;

$ffi->Do(1, 2, $param, $cbparam);

//how to correctly free param and cbparam

我尝试使用 FFI::free($param[0]) 释放 $param,但它抛出 zend_mm_heap 损坏错误。 如果我不释放 $param,我会看到内存通过 PHP 函数 var_dump(memory_get_usage()); 继续增长。

补充一点,C++函数不会释放这部分内存。

感谢您的帮助。

php c++ dll ffi
1个回答
0
投票

在 PHP 的外部函数接口 (FFI) 中,内存管理通常由 PHP 的垃圾收集器自动处理。但是,在需要手动内存管理的情况下,您可以使用

FFI::free()
方法显式释放内存。

例如,如果您使用

FFI::new("void*[2]", false, true)
为 void 指针数组分配了内存,则可以按如下方式释放内存:

// Allocate memory for an array of void pointers
$voidPtrArray = FFI::new("void*[2]", false, true);

// Access elements of the array (optional)
$voidPtrArray[0] = ...; // Assign a value to the first element
$voidPtrArray[1] = ...; // Assign a value to the second element

// Free the allocated memory
FFI::free($voidPtrArray);

通过调用

FFI::free($voidPtrArray)
,您可以释放为 void 指针数组分配的内存,确保其被正确释放。

需要注意的是,仅当明确需要内存管理时才应使用

FFI::free()
。在大多数情况下,PHP 的垃圾收集器将自动处理内存清理,除非绝对必要,否则应避免手动内存管理。此外,请确保仅为使用
FFI::new()
显式分配的变量释放内存。尝试释放未使用
FFI::new()
分配的变量的内存可能会导致未定义的行为或崩溃。 https://bammtech.com/en/thrivedx-solutions/

© www.soinside.com 2019 - 2024. All rights reserved.