簡體   English   中英

C#Pinvoke免費本機C ++內存

[英]C# pinvoke free native c++ memory

如果我有一個c ++函數,它返回一個char *像這樣:

char *cctalk_app_event_name(DG_CCTALK_APP_EVT_CODE);

以及相應的C#簽名:

[System.Runtime.InteropServices.DllImportAttribute("cctalk.dll", EntryPoint = "cctalk_app_event_name", CallingConvention = CallingConvention.Cdecl)]
    public static extern System.IntPtr cctalk_app_event_name(DG_CCTALK_APP_EVT_CODE param0);

如果本機代碼返回分配有new關鍵字的char *,我確定每次調用C#函數時都會有memleak嗎? 有什么辦法可以釋放內存嗎?

我對函數名的直覺是,這很可能是返回指向DLL中字符串常量的指針,在這種情況下,您不必擔心會釋放指針。

如果沒有使用SDK的手冊( 此處的鏈接 ),那么我將反匯編DLL並查看該函數的作用,但是不必擔心在確定需要刪除它之前如何刪除它。 。

如果您沒有任何文檔或資料,那么您將不知道是否為內存分配了新的內存。 如果使用new分配,則需要使用delete取消分配。 這只能通過本機代碼完成。 如果需要,則DLL將需要為您導出一個解除分配器。

其他可能性包括從共享堆(例如COM堆)進行分配。 不太可能。 或者,也許字符串是靜態分配的,不需要釋放。 當函數返回C字符串作為返回值時,通常是這種最終選擇。 如果您不得不猜測,那就是百分比選項。 無論如何,如果您無法取消分配字符串,您還能做什么?

您可以確定的唯一方法是獲得文檔,源代碼或作者的支持。 我很高興您想知道解決方案,但是您唯一的希望是本段第一句中列出的選項。

我很難相信如此復雜的庫沒有文檔。 您是怎么來這個圖書館的? 您真的確定沒有文檔嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM