C#调用非托管DLL,释放内存的问题

.Net技术 码拜 8年前 (2016-09-17) 2959次浏览
本人用C++写了一个DLL,里面有如下参数

static int  num;
static double beltLocation1x, beltLocation1y, beltLocation2x, beltLocation2y; 
static double beltLocation3x, beltLocation3y, beltLocation4x, beltLocation4y; 
static double houghMin, gangueMin, maoganMin, crossAlarmDistance, cannyMin, cannyMax;
static float x0, x1, k, l;
static bool isFirstFrame;
static Mat frame, gray, edge, mask, location1, location2, maoganMask, preZhoujie; 
static Mat center, labels;
static vector<double> block, strip;
static vector<Vec2f> noline;
static vector<Vec2f> center_point;
static vector<Point2f> prePoints;
static Ptr<BackgroundSubtractorMOG2> mog;
static struct IMAGE_INFO image_info;
static struct ALARM_INFO alarm_info;
static struct RESULT_INFO result_info;
static VideoCapture video;

可以看到有普通变量,有opencv的Mat类,还有vector类,结构体等
然后本人导出了三个函数供C#调用,分别是:

bool Init(PARAMETER_INFO *parameter);  // 对上面的参数进行初始化
RESULT_INFO  Process();  // 调用一些函数处理数据,赋给上面的参数,然后返回其中的一个结构体
bool CleanUp(); // 提供给C#清理内存的函数

现在本人不清楚在CleanUp();函数中应该怎么样清理内存
int, double类型的数据需要清理嘛?
Mat类的变量的内存会自动释放嘛?
结构体类型的内存呢?
望高手不吝赐教!

解决方案

10

不是手动分配的内存,要怎么释放?

10

引用:
Quote: 引用:

释放你申请的内存

变量本人都是直接赋值的,Mat类的是用的构造函数,并没有用过malloc或是new这些
所以不知道怎么释放。新手

class A
{
public:
int  num;
double beltLocation1x, beltLocation1y, beltLocation2x, beltLocation2y;
……
}
static A* pa;
pa = new A; //Init中
delete pa; //CleanUp中

10

事实上,CleanUp() 十有八九是必须要调用的,否则就会造成内存溢出,在一个多次、或多进程、或多线程调用过 Init 的方法的程序中就会产生内存溢出现象。
但是,CleanUp() 你要怎么设计呢?这完全可以在你的 c++ 程序内部本人测试好。你在c++内部尚不知怎么样调用 CleanUp() 函数,跑到 c# 论坛来问怎么样设计 CleanUp() 函数,本人猜,你对于 c++ 程序编程,也没有一个专业的开发稳定产品的保证。

10

现在本人不清楚在CleanUp();函数中应该怎么样清理内存
int, double类型的数据需要清理嘛?
Mat类的变量的内存会自动释放嘛?
结构体类型的内存呢?
==>
int,double,结构体是值类型变量,程序运行时,存储在栈上,CPU取指令运行后,地址出栈,也就自动释放
对于类,是引用类型,GC会在适当时候清理
假如要手动清理的,注意非托管的“流”,如stream,dbconnection等,这些需要手动Close()
所以,你列出的这几项,无需CleanUp();

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#调用非托管DLL,释放内存的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)