当使用指向结构体的指针以及在C++和C#之间使用它们时,我需要删除指针吗?

h5qlskok  于 2023-02-26  发布在  C#
关注(0)|答案(1)|浏览(160)

我有一个使用C#和C的程序。C是用来做低级的事情,如渲染。在C#中,我正在做一个Input类。它使用GLFW来获取鼠标位置:

extern "C" __declspec(dllexport) Vector2* GetCursorPos()
{
    double xpos, ypos;
    glfwGetCursorPos(Window, &xpos, &ypos);

    Vector2* pos = new Vector2{ (float)xpos, (float)ypos };
    return pos;
}

下面是Vector2结构:

struct Vector2
{
    float X;
    float Y;
};

在Input类中:

[DllImport("Internal.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern unsafe Vector2* GetCursorPos();

public static unsafe (float x, float y) GetMousePosition()
{
    Vector2* pos = GetCursorPos();
    return (pos->X, pos->Y);
}

我的问题是,我应该删除这个Vector2*吗?(以及在哪里删除)还是由于C#中的垃圾收集而不需要它?

dxpyg8gm

dxpyg8gm1#

如果使用该结构,则必须通过在c端创建另一个函数(如FreeCursorPos)来删除它
或者,您可以在参数中返回x和y位置,如下所示:
在c
中:

extern "C" __declspec(dllexport) void GetCursorPos(float * outxpos, float * outypos)
{
    double xpos, ypos;
    glfwGetCursorPos(Window, &xpos, &ypos);

    *outxpos = (float)xpos;
    *outypos = (float)ypos; 
    return pos;
}

这样做的好处不仅是不需要新建和删除,而且不再需要将c#标记为unsafe

[DllImport("Internal.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern void GetCursorPos(float * outxpos, float * outxpos);

public static (float x, float y) GetMousePosition()
{
    float outxpos;
    float outxpos;
    GetCursorPos(&outxpos, &outypos);
    return (outxpos, outypos);
}

相关问题