作者su27 (su27)
看板C_and_CPP
标题[问题] C#调用vc++打包的dll,记忆体会一直上升
时间Fri Jan 8 14:34:24 2021
开发平台(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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1610087666.A.FC9.html
1F:→ shibin: 如果是new char[] 要搭配使用delete[]而不是delete喔01/08 15:39
2F:→ 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
3F:推 TeaEEE: 你是return一个string还是c#传pointer去get string?01/08 16:49
4F:推 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
5F:→ Lipraxde: 有开 thread 吗?01/08 17:44
有
※ 编辑: su27 (220.136.106.27 台湾), 01/08/2021 18:12:36
6F:→ Lipraxde: 看是不是有在不同 thread 释放 memory 的情形,我以前01/08 19:05
7F:→ Lipraxde: 在 linux 上遇到过,不知道 windows 上会不会也发生同01/08 19:05
8F:→ Lipraxde: 样的事01/08 19:05
请问一下
都没错误的状况下
不管执行多少遍 记忆体都不会一直增加 是吗?
※ 编辑: su27 (220.136.106.27 台湾), 01/08/2021 19:13:48
9F:推 Schottky: 都没错误(X) 错误藏在你没看见、想不到的地方(O)01/08 19:25
10F:推 Schottky: 都没错误(X) 错误藏在你没看见、想不到的地方(O)01/08 19:25
11F:推 ko27tye: 你在dll内allocate的记忆体 也要由dll来释放01/08 19:34
12F:→ ko27tye: 把你dll内delete的行为包成一个function给上层呼叫01/08 19:35
13F:→ 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
14F:→ WPC001: 一定是没适当的释放... 就这样,你没把code贴出来01/08 23:47
15F:→ WPC001: 根本没人知道你是怎麽写的,甚至有可能问题出在C#而不是C++01/08 23:48
16F:→ kobe8112: 使用VS的追踪工具检视相关资源、将DLL功能拆分成多个部01/09 00:01
17F:→ kobe8112: 份分别测试、在逻辑不变的前提DLL运算数量简化到最小...01/09 00:03
18F:→ kobe8112: 我自己的话会从这几个方向着手,当然最快作法就是贴code01/09 00:03
我本来是执行一大堆程式(使用很多dll的函数)
把他拆成
把他拆成
1.只载入图片20000次 内存是28M 看起来没问题
2.将图片转成灰度图。 20000次後 变成51M
这函数没任何数字及字串 输入输出
程式码挺大的 现在也不晓得到底哪里有问题
就如我说的 执行两三次内存是相同的 没任何变化
我估计我得在C#写个小程式 才能知道哪里出问题
谢谢
※ 编辑: su27 (220.136.106.27 台湾), 01/09/2021 03:16:55
19F:→ petercoin: 看看转灰度图的部分有没有没释放掉的记忆体阿01/09 03:19
20F:→ petercoin: 如果那个功能是用WINAPI做的,有些释放记忆体是要另外01/09 03:19
21F:→ petercoin: 呼叫相对应的function,没有呼叫就会一直吃掉记忆体01/09 03:20
22F:→ sarafciel: 我猜问题应该是出在C# 你有物件是从manage转unmanage吗01/10 00:12
Struct算吗
我的数据交换是用struct
※ 编辑: su27 (42.74.224.220 台湾), 01/10/2021 16:21:06
23F:→ sarafciel: 用C#做的struct或class都是managed,简单的说,他们都 01/10 21:06
24F:→ sarafciel: 会被GC控管,在处理这种C#跟VC++的介接时,会碰到的一 01/10 21:08
25F:→ sarafciel: 个问题是C++处理到一半时C#的GC被叫起来 然後把你丢到 01/10 21:09
26F:→ sarafciel: C++的struct释放掉,所以有一个函式是指定某个物件要求 01/10 21:12
27F:→ sarafciel: GC不要去处理他 你可能要找一下code有没有这种东西 01/10 21:13
28F:→ kobe8112: 帮楼上补关键字: GCHandle 01/11 09:11
29F:→ sunneo: 看图片载入是从哪做的 通常都会有dispose() 可以用 01/16 23:38