本人用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
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++ 程序编程,也没有一个专业的开发稳定产品的保证。
但是,CleanUp() 你要怎么设计呢?这完全可以在你的 c++ 程序内部本人测试好。你在c++内部尚不知怎么样调用 CleanUp() 函数,跑到 c# 论坛来问怎么样设计 CleanUp() 函数,本人猜,你对于 c++ 程序编程,也没有一个专业的开发稳定产品的保证。
10
现在本人不清楚在CleanUp();函数中应该怎么样清理内存?
int, double类型的数据需要清理嘛?
Mat类的变量的内存会自动释放嘛?
结构体类型的内存呢?
==>
int,double,结构体是值类型变量,程序运行时,存储在栈上,CPU取指令运行后,地址出栈,也就自动释放
对于类,是引用类型,GC会在适当时候清理
假如要手动清理的,注意非托管的“流”,如stream,dbconnection等,这些需要手动Close()
所以,你列出的这几项,无需CleanUp();
int, double类型的数据需要清理嘛?
Mat类的变量的内存会自动释放嘛?
结构体类型的内存呢?
==>
int,double,结构体是值类型变量,程序运行时,存储在栈上,CPU取指令运行后,地址出栈,也就自动释放
对于类,是引用类型,GC会在适当时候清理
假如要手动清理的,注意非托管的“流”,如stream,dbconnection等,这些需要手动Close()
所以,你列出的这几项,无需CleanUp();