[問題] C#調用vc++打包的dll,記憶體會一直上升

看板C_and_CPP (C/C++)作者 (su27)時間4年前 (2021/01/08 14:34), 4年前編輯推噓5(5023)
留言28則, 9人參與, 4年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) win10 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) vs2017 我在vc++寫好的opencv 在vc++執行幾萬次 記憶體都不會增加 封裝成dll檔給c#使用 每執行一次不會有變化, 但連續執行(至少十幾次後) 會看到約0.1M的增加 執行20000次後 記憶體從30M變成80M 我有使用new char[]的都有delete 我有使用new char[]的都有delete 我有使用new char[]的都有delete 我有使用new char[]的都有delete 我有使用new char[]的都有delete 我有使用new char[]的都有delete 我有使用new char[]的都有delete 我有使用new char[]的都有delete 在c#跟c++數字交換是用struct 都是由c#這邊生成struct 在丟給vc++去讀取或寫入數據 字串交換都是c#宣告string 在丟給vc++ Vc++有new char[] 也會事後在vc++ delete 日前我找不到什麼原因記憶體會不斷上升 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.136.106.27 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1610087666.A.FC9.html

01/08 15:39, 4年前 , 1F
如果是new char[] 要搭配使用delete[]而不是delete喔
01/08 15:39, 1F

01/08 15:39, 4年前 , 2F
如果是new char[] 要搭配使用delete[]而不是delete喔
01/08 15:39, 2F
是delete[]沒錯 是delete[]沒錯 ※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 16:22:31 ※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 16:22:31

01/08 16:49, 4年前 , 3F
你是return一個string還是c#傳pointer去get string?
01/08 16:49, 3F

01/08 16:49, 4年前 , 4F
你是return一個string還是c#傳pointer去get string?
01/08 16:49, 4F
在c#是寫成ref string temp C++則是 char* &temp ※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 17:18:01

01/08 17:44, 4年前 , 5F
有開 thread 嗎?
01/08 17:44, 5F
※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 18:12:36

01/08 19:05, 4年前 , 6F
看是不是有在不同 thread 釋放 memory 的情形,我以前
01/08 19:05, 6F

01/08 19:05, 4年前 , 7F
在 linux 上遇到過,不知道 windows 上會不會也發生同
01/08 19:05, 7F

01/08 19:05, 4年前 , 8F
樣的事
01/08 19:05, 8F
請問一下 都沒錯誤的狀況下 不管執行多少遍 記憶體都不會一直增加 是嗎? ※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 19:13:48

01/08 19:25, 4年前 , 9F
都沒錯誤(X) 錯誤藏在你沒看見、想不到的地方(O)
01/08 19:25, 9F

01/08 19:25, 4年前 , 10F
都沒錯誤(X) 錯誤藏在你沒看見、想不到的地方(O)
01/08 19:25, 10F

01/08 19:34, 4年前 , 11F
你在dll內allocate的記憶體 也要由dll來釋放
01/08 19:34, 11F

01/08 19:35, 4年前 , 12F
把你dll內delete的行為包成一個function給上層呼叫
01/08 19:35, 12F

01/08 19:35, 4年前 , 13F
把你dll內delete的行為包成一個function給上層呼叫
01/08 19:35, 13F
我目前的確是 由dll創建的 也做一個函數由c#呼叫去delete C#要輸入值 就用marshal.AllocHGlobal dll用完後 marshal.FreeHGlobal去刪除 ※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 19:53:56

01/08 23:47, 4年前 , 14F
一定是沒適當的釋放... 就這樣,你沒把code貼出來
01/08 23:47, 14F

01/08 23:48, 4年前 , 15F
根本沒人知道你是怎麼寫的,甚至有可能問題出在C#而不是C++
01/08 23:48, 15F

01/09 00:01, 4年前 , 16F
使用VS的追蹤工具檢視相關資源、將DLL功能拆分成多個部
01/09 00:01, 16F

01/09 00:03, 4年前 , 17F
份分別測試、在邏輯不變的前提DLL運算數量簡化到最小...
01/09 00:03, 17F

01/09 00:03, 4年前 , 18F
我自己的話會從這幾個方向著手,當然最快作法就是貼code
01/09 00:03, 18F
我本來是執行一大堆程式(使用很多dll的函數) 把他拆成 把他拆成 1.只載入圖片20000次 內存是28M 看起來沒問題 2.將圖片轉成灰度圖。 20000次後 變成51M 這函數沒任何數字及字串 輸入輸出 程式碼挺大的 現在也不曉得到底哪裡有問題 就如我說的 執行兩三次內存是相同的 沒任何變化 我估計我得在C#寫個小程式 才能知道哪裡出問題 謝謝 ※ 編輯: su27 (220.136.106.27 臺灣), 01/09/2021 03:16:55

01/09 03:19, 4年前 , 19F
看看轉灰度圖的部分有沒有沒釋放掉的記憶體阿
01/09 03:19, 19F

01/09 03:19, 4年前 , 20F
如果那個功能是用WINAPI做的,有些釋放記憶體是要另外
01/09 03:19, 20F

01/09 03:20, 4年前 , 21F
呼叫相對應的function,沒有呼叫就會一直吃掉記憶體
01/09 03:20, 21F

01/10 00:12, 4年前 , 22F
我猜問題應該是出在C# 你有物件是從manage轉unmanage嗎
01/10 00:12, 22F
Struct算嗎 我的數據交換是用struct ※ 編輯: su27 (42.74.224.220 臺灣), 01/10/2021 16:21:06

01/10 21:06, 4年前 , 23F
用C#做的struct或class都是managed,簡單的說,他們都
01/10 21:06, 23F

01/10 21:08, 4年前 , 24F
會被GC控管,在處理這種C#跟VC++的介接時,會碰到的一
01/10 21:08, 24F

01/10 21:09, 4年前 , 25F
個問題是C++處理到一半時C#的GC被叫起來 然後把你丟到
01/10 21:09, 25F

01/10 21:12, 4年前 , 26F
C++的struct釋放掉,所以有一個函式是指定某個物件要求
01/10 21:12, 26F

01/10 21:13, 4年前 , 27F
GC不要去處理他 你可能要找一下code有沒有這種東西
01/10 21:13, 27F

01/11 09:11, 4年前 , 28F
幫樓上補關鍵字: GCHandle
01/11 09:11, 28F
文章代碼(AID): #1Vz_po_9 (C_and_CPP)
文章代碼(AID): #1Vz_po_9 (C_and_CPP)