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

SugarAnnie 2016-08-26 10:36:44
我用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类的变量的内存会自动释放嘛?
结构体类型的内存呢?
望大神不吝赐教!!
...全文
416 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
SugarAnnie 2016-08-29
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
事实上,CleanUp() 十有八九是必须要调用的,否则就会造成内存溢出,在一个多次、或者多进程、或者多线程调用过 Init 的方法的程序中就会产生内存溢出现象。 但是,CleanUp() 你要怎样设计呢?这完全可以在你的 c++ 程序内部自己测试好。你在c++内部尚不知如何调用 CleanUp() 函数,跑到 c# 论坛来问如何设计 CleanUp() 函数,我猜,你对于 c++ 程序编程,也没有一个专业的开发稳定产品的保证。
是的,我还是个学生,第一次接触C++编程的项目 谢谢指点!!
秋的红果实 2016-08-28
  • 打赏
  • 举报
回复
现在我不明白在CleanUp();函数中应该如何清理内存? int, double类型的数据需要清理嘛? Mat类的变量的内存会自动释放嘛? 结构体类型的内存呢? ==> int,double,结构体是值类型变量,程序运行时,存储在栈上,CPU取指令运行后,地址出栈,也就自动释放 对于类,是引用类型,GC会在适当时候清理 如果要手动清理的,注意非托管的“流”,如stream,dbconnection等,这些需要手动Close() 所以,你列出的这几项,无需CleanUp();
SugarAnnie 2016-08-27
  • 打赏
  • 举报
回复
引用 5 楼 shingoscar 的回复:
[quote=引用 2 楼 SugarAnnie 的回复:] [quote=引用 1 楼 woshirenjun12 的回复:] 释放你申请的内存
变量我都是直接赋值的,Mat类的是用的构造函数,并没有用过malloc或者是new这些 所以不知道怎么释放。。新手[/quote] class A { public: int num; double beltLocation1x, beltLocation1y, beltLocation2x, beltLocation2y; …… } static A* pa; pa = new A; //Init中 delete pa; //CleanUp中[/quote] 这个我知道,不过我没有写成类。其实写的是C程序
SugarAnnie 2016-08-27
  • 打赏
  • 举报
回复
引用 3 楼 woshirenjun12 的回复:
[quote=引用 2 楼 SugarAnnie 的回复:] [quote=引用 1 楼 woshirenjun12 的回复:] 释放你申请的内存
变量我都是直接赋值的,Mat类的是用的构造函数,并没有用过malloc或者是new这些 所以不知道怎么释放。。新手[/quote] 不是动态申请的内存那就不用管了[/quote] 好的,谢谢!!
  • 打赏
  • 举报
回复
引用 7 楼 SugarAnnie 的回复:
这个我知道,不过我没有写成类。其实写的是C程序
写不写成类,用 c 还是 c++,你都要首先学会在 c/c++ 复杂应用中保证不会内存溢出。 c/c++ 是非常乱的,程序员需要自己保证不会产生内存溢出。外人怎么知道你要做什么呢?怎么知道 CleanUp() 函数需要什么输入参数才能保证不会产生内存溢出错误呢?
  • 打赏
  • 举报
回复
事实上,CleanUp() 十有八九是必须要调用的,否则就会造成内存溢出,在一个多次、或者多进程、或者多线程调用过 Init 的方法的程序中就会产生内存溢出现象。 但是,CleanUp() 你要怎样设计呢?这完全可以在你的 c++ 程序内部自己测试好。你在c++内部尚不知如何调用 CleanUp() 函数,跑到 c# 论坛来问如何设计 CleanUp() 函数,我猜,你对于 c++ 程序编程,也没有一个专业的开发稳定产品的保证。
  • 打赏
  • 举报
回复
你给出 CleanUp() 函数的内容,别人才理解你的意思!
Poopaye 2016-08-27
  • 打赏
  • 举报
回复
知道还要问如何释放吗? 还有c程序哪来的vector
Poopaye 2016-08-26
  • 打赏
  • 举报
回复
引用 2 楼 SugarAnnie 的回复:
[quote=引用 1 楼 woshirenjun12 的回复:] 释放你申请的内存
变量我都是直接赋值的,Mat类的是用的构造函数,并没有用过malloc或者是new这些 所以不知道怎么释放。。新手[/quote] class A { public: int num; double beltLocation1x, beltLocation1y, beltLocation2x, beltLocation2y; …… } static A* pa; pa = new A; //Init中 delete pa; //CleanUp中
Poopaye 2016-08-26
  • 打赏
  • 举报
回复
不是手动分配的内存,要怎么释放?
IT_拖油瓶 2016-08-26
  • 打赏
  • 举报
回复
引用 2 楼 SugarAnnie 的回复:
[quote=引用 1 楼 woshirenjun12 的回复:] 释放你申请的内存
变量我都是直接赋值的,Mat类的是用的构造函数,并没有用过malloc或者是new这些 所以不知道怎么释放。。新手[/quote] 不是动态申请的内存那就不用管了
SugarAnnie 2016-08-26
  • 打赏
  • 举报
回复
引用 1 楼 woshirenjun12 的回复:
释放你申请的内存
变量我都是直接赋值的,Mat类的是用的构造函数,并没有用过malloc或者是new这些 所以不知道怎么释放。。新手
IT_拖油瓶 2016-08-26
  • 打赏
  • 举报
回复
释放你申请的内存

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧