看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
shibin: 如果是new char[] 要搭配使用delete[]而不是delete喔01/08 15:39
shibin: 如果是new char[] 要搭配使用delete[]而不是delete喔01/08 15:39
是delete[]沒錯 是delete[]沒錯 ※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 16:22:31 ※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 16:22:31
TeaEEE: 你是return一個string還是c#傳pointer去get string?01/08 16:49
TeaEEE: 你是return一個string還是c#傳pointer去get string?01/08 16:49
在c#是寫成ref string temp C++則是 char* &temp ※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 17:18:01
Lipraxde: 有開 thread 嗎?01/08 17:44
※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 18:12:36
Lipraxde: 看是不是有在不同 thread 釋放 memory 的情形,我以前01/08 19:05
Lipraxde: 在 linux 上遇到過,不知道 windows 上會不會也發生同01/08 19:05
Lipraxde: 樣的事01/08 19:05
請問一下 都沒錯誤的狀況下 不管執行多少遍 記憶體都不會一直增加 是嗎? ※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 19:13:48
Schottky: 都沒錯誤(X) 錯誤藏在你沒看見、想不到的地方(O)01/08 19:25
Schottky: 都沒錯誤(X) 錯誤藏在你沒看見、想不到的地方(O)01/08 19:25
ko27tye: 你在dll內allocate的記憶體 也要由dll來釋放01/08 19:34
ko27tye: 把你dll內delete的行為包成一個function給上層呼叫01/08 19:35
ko27tye: 把你dll內delete的行為包成一個function給上層呼叫01/08 19:35
我目前的確是 由dll創建的 也做一個函數由c#呼叫去delete C#要輸入值 就用marshal.AllocHGlobal dll用完後 marshal.FreeHGlobal去刪除 ※ 編輯: su27 (220.136.106.27 臺灣), 01/08/2021 19:53:56
WPC001: 一定是沒適當的釋放... 就這樣,你沒把code貼出來01/08 23:47
WPC001: 根本沒人知道你是怎麼寫的,甚至有可能問題出在C#而不是C++01/08 23:48
kobe8112: 使用VS的追蹤工具檢視相關資源、將DLL功能拆分成多個部01/09 00:01
kobe8112: 份分別測試、在邏輯不變的前提DLL運算數量簡化到最小...01/09 00:03
kobe8112: 我自己的話會從這幾個方向著手,當然最快作法就是貼code01/09 00:03
我本來是執行一大堆程式(使用很多dll的函數) 把他拆成 把他拆成 1.只載入圖片20000次 內存是28M 看起來沒問題 2.將圖片轉成灰度圖。 20000次後 變成51M 這函數沒任何數字及字串 輸入輸出 程式碼挺大的 現在也不曉得到底哪裡有問題 就如我說的 執行兩三次內存是相同的 沒任何變化 我估計我得在C#寫個小程式 才能知道哪裡出問題 謝謝 ※ 編輯: su27 (220.136.106.27 臺灣), 01/09/2021 03:16:55
petercoin: 看看轉灰度圖的部分有沒有沒釋放掉的記憶體阿01/09 03:19
petercoin: 如果那個功能是用WINAPI做的,有些釋放記憶體是要另外01/09 03:19
petercoin: 呼叫相對應的function,沒有呼叫就會一直吃掉記憶體01/09 03:20
sarafciel: 我猜問題應該是出在C# 你有物件是從manage轉unmanage嗎01/10 00:12
Struct算嗎 我的數據交換是用struct ※ 編輯: su27 (42.74.224.220 臺灣), 01/10/2021 16:21:06
sarafciel: 用C#做的struct或class都是managed,簡單的說,他們都 01/10 21:06
sarafciel: 會被GC控管,在處理這種C#跟VC++的介接時,會碰到的一 01/10 21:08
sarafciel: 個問題是C++處理到一半時C#的GC被叫起來 然後把你丟到 01/10 21:09
sarafciel: C++的struct釋放掉,所以有一個函式是指定某個物件要求 01/10 21:12
sarafciel: GC不要去處理他 你可能要找一下code有沒有這種東西 01/10 21:13
kobe8112: 幫樓上補關鍵字: GCHandle 01/11 09:11
sunneo: 看圖片載入是從哪做的 通常都會有dispose() 可以用 01/16 23:38