1. 程式人生 > >malloc: *** error for object 0x1018ad6a0: pointer being freed was not allocated

malloc: *** error for object 0x1018ad6a0: pointer being freed was not allocated

.cs 中的原始程式碼如下:

public class JsonTest : MonoBehaviour {
    // Use this for initialization
    [DllImport("__Internal")]
    private static extern string xxxsdk_channelId();
    void Start()
    {
        string strChannelID = xxxsdk_channelId();
        Debug.Log("strChannelID\t" + strChannelID);
    }
}

mm 中的externC程式碼如下:

extern "C" {
    const char* xxxsdk_channelId()
    {
        NSString* channelid = @"111";
        return [channelid UTF8String];
    }
}

或者如下

extern "C" {
    char* xxxsdk_channelId()
    {
        return const_cast<char*>([@"111" UTF8String]);
    }
}

或者如下

extern "C" {
    char* xxxsdk_channelId()
    {
        return "111";
    }
}

或者等等都有問題 出現的錯誤是

malloc: *** error for object 0x1018ad6a0: pointer being freed was not allocated。

 

原因是因為,對 原始C#程式碼 進行 IL2CPP的時候,對於:

    [DllImport("__Internal")]
    private static extern string xxxsdk_channelId();

 .Net執行時固化成C++以後的結果為如下:(xcode中看Bulk_Assembly-CSharp_X.cpp)

extern "C" char* DEFAULT_CALL xxxsdk_channelId();

// 對於 private static extern string xxxsdk_channelId();的翻譯
// System.String JsonTest::xxxsdk_channelId()
extern "C"  String_t* JsonTest_xxxsdk_channelId_m2725694806 (Il2CppObject * __this /* static, unused */, const MethodInfo* method)
{
	typedef char* (DEFAULT_CALL *PInvokeFunc) ();
    
    // 執行 .mm 檔案 中定義的 xxxsdk_channelId
	// Native function invocation
	char* returnValue = reinterpret_cast<PInvokeFunc>(xxxsdk_channelId)();

	// 把char* 轉換成 C#中的String_t*  Marshal類
    // Marshaling of return value back from native representation
	String_t* _returnValue_unmarshaled = NULL;
	_returnValue_unmarshaled = il2cpp_codegen_marshal_string_result(returnValue);

    // returnValue是通過 malloc 申請的,所以要釋放,如果本身不是通過malloc的話,呼叫這句話就會出錯。
	// Marshaling cleanup of return value native representation
	il2cpp_codegen_marshal_free(returnValue);
	returnValue = NULL;

	return _returnValue_unmarshaled;
}

即當呼叫 

il2cpp_codegen_marshal_free(returnValue);的時候出現的錯誤:

malloc: *** error for object 0x1018ad6a0: pointer being freed was not allocated

不能free,因為以上的char* 都不是 malloc出來的。

 

所以修改 .mm , 寫一個malloc分配字串的介面

char* MakeStringCopy(const char* string)
{
    if (string == NULL)
        return NULL;
    
    char* res = (char*)malloc(strlen(string) + 1);
    strcpy(res, string);
    return res;
}
extern "C" {
    char* xxxsdk_channelId()
    {
        return MakeStringCopy("134");
    }
}