Objective-C到C到C#统一包装可能导致内存泄漏?

Objective-C到C到C#统一包装可能导致内存泄漏?,c#,ios,objective-c,c,memory-leaks,C#,Ios,Objective C,C,Memory Leaks,我正在编写一个unity插件,将本机iOS功能连接到unity 我必须做的一件事是将字符串从Objective-C(iOS)发回C#(Unity),这是通过编写一个简单的C外部函数来完成的 我发现这个帖子: 建议使用可通过C extern返回的helper函数: // Helper method to create C string copy char* MakeStringCopy (const char* string) { if (string == NULL)

我正在编写一个unity插件,将本机iOS功能连接到unity

我必须做的一件事是将字符串从Objective-C(iOS)发回C#(Unity),这是通过编写一个简单的C外部函数来完成的

我发现这个帖子:

建议使用可通过C extern返回的helper函数:

// Helper method to create C string copy
char* MakeStringCopy (const char* string)
{
    if (string == NULL)
        return NULL;

    char* res = (char*)malloc(strlen(string) + 1);
    strcpy(res, string);
    return res;
}
我对Unity不是很精通,所以我不知道这是否会导致内存泄漏

从纯Objective-C的角度来看,函数

  • 获取一个字符指针
  • 根据原始字符串的长度分配一些内存空间
  • 将原始字符串复制到此新分配的空间中
  • 返回新复制的指针
  • 助手函数在C外部函数中的使用方式如下:

    return cStringCopy([objc_status UTF8String]);
    
    string someInfo = SDKWrapper_getInfo();
    
    因此,原始字符串使用的内存由Objective-C自动管理,但是

    一旦Unity收到char指针,它会自动释放分配的内存吗?

    C#unity脚本使用如下函数:

    return cStringCopy([objc_status UTF8String]);
    
    string someInfo = SDKWrapper_getInfo();
    
    这个问题的答案是:


    (我认为)这与此有关,因此它确实让我觉得我这里有内存泄漏。

    是的,这会泄漏内存。解决方案是将托管内存块(即
    StringBuilder
    )传递给本机函数,即:

    [DllImport(...)]
    private static extern int GetInfo
        ([MarshalAs(UnmanagedType.LPWStr)]StringBuilder dst, int dstCapacity);
    
    private void SomeMethod()
    {
        var sb = new StringBuilder(8192);
    
        // perhaps the function can indicate whether the capacity was large enough
        var success = GetInfo(sb, sb.Capacity);
    }
    

    您可以在上看到类似的示例。

    接受的答案是错误的。尽管有些人提到这种方式会导致内存泄漏,但这是不对的。这种方法在Unity中运行良好,不会发生泄漏(我多次测试过)。那

    从本机方法返回的字符串值应该是UTF–8编码的,并在堆上分配。单编组对这样的字符串调用是免费的


    您可能想阅读以下关于返回
    char*
    的答案: