我的代码中有这个功能似乎工作得很好:
-- type declaration just for reference, i don't have it in my actual code
retrieveVulkanArray :: Storable a => (Ptr Word32 -> Ptr a -> IO b) -> IO (Ptr a, Int)
retrieveVulkanArray' f =
alloca $ \arrCount -> do
f arrCount vkNullPtr
arrCount' <- fromIntegral <$> peek arrCount
allocaArray arrCount' $ \resArray -> do
f arrCount resArray
pure (resArray, arrCount')
(对于上下文,这是从 Vulkan API 获取 FFI 数组的辅助函数,例如 f 可能是vkEnumeratePhysicalDevices)
当我查看我的代码时,我注意到它返回 resArray(从 allocaArray 的描述中似乎只在内部 lambda 中有效)给它的调用者。在 C 中,这样的代码将是未定义的行为。我的直觉在这里是正确的还是有更多的事情发生?毕竟我还没有注意到任何崩溃:)