gpt4 book ai didi

c# - 对固定 block 内的指针所做的更改是否保留?

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:45 31 4
gpt4 key购买 nike

请看下面的 C# 代码:

    double* ptr;

fixed(double* vrt_ptr = &vertices[0])
{
fixed(int* tris_ptr = &tris[0])
{
ptr = compute(vrt_ptr, 5, (double*)tris_ptr, 5);
// compute() is a native C++ function
}
}

Debug.Log("Vertices Recieved: " + *ptr);
/* and so on */

我有来自 *ptr 的垃圾值。我怀疑 compute 分配给 ptr 的数组没有保留在固定 block 之外。是这样吗??还是其他问题?

最佳答案

这是不是有效的代码,垃圾收集器只能更新vrt_ptrtris_ptr 变量的值。但是非托管代码使用这些指针的拷贝,GC 无法更新拷贝的值。因此,如果在非托管代码运行时发生垃圾回收,例如当程序中的其他线程触发回收时,非托管代码将通过指针拷贝读取垃圾数据。很难诊断,这种情况很少发生。

必须固定顶点和tris数组。在您的情况下,pinvoke 编码器已经巧妙地完成了,只需直接传递数组而不使用 fixed。修复:

   double* ptr = compute(vertices, 5, tris, 5);

相应地调整 pinvoke 声明,将 double* 替换为 double[]。

您现在还必须处理您最初编写此代码的可能原因。将 int[] 转换为 double[] 是永远有效的没有场景,这可能是您在 GC 灾难发生之前提前获得垃圾结果的原因。如果由于某种原因无法更新 tris 的声明,则必须在调用之前创建一个 double[]。

关于c# - 对固定 block 内的指针所做的更改是否保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20214882/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com