我正在使用 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 的外部函数接口 (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/