1、C++标准库的那几个容器会自动释放内存么- =还需要手工释放么,怎么释放
有自己的析构函数,不过不要指望如果用了new vector<int>这样的东西,它们会能知道自己被构造在堆上……
2、java中array使用后需要释放吗,如需要请问怎样释放?
java中不考虑内存释放问题,程序员控制不了,即时调用了析构方法也不是立即释放内存
3、哪种情况下需要释放变量内存呢?
不用加的,控件会自动生成析构函数的,当窗体关闭时执行。自己申请的空间才需释放。
4、CArray需要释放吗
CArray本身是不需要释放的,但如果其内存储了其它new出来的对象指针,那么这回些new出来的对象,就答需要你自己手动去释放了,否则会有内存泄漏!当然,如果它存储的是些基本数据类型(如int),也就不需要释放了!
5、memset分配的空间用完以后需要进行释放吗? 如果需要释放,怎么释放呢? 求解答
memset是对一块已有空间进行内容的初始化
如果这块空间是用malloc分配出来的,当然要释放内,用free
如果本来就是容字符串数组,那就不用释放了。
memset(line,0x0,MAX_MSG);
就是对line为头的这MAX_MSG长度的内存空间赋值0x0
相当于给line这个字符串清空。也就是说字符串里现在是一串字符串结束符'\0'
6、什么样的指针需要释放?该怎么解决
会不会自动释放 ctTemp的4个字节空间?问题2:CDC *dc=GetDC();CBitmap cbTemp;cbTemp.CreateDibComp..(..)在局部函数申请的空间,在堆上创建 得调用Delete那dc这个指针不是申请的,何必释放呢,难道函数结束不自己释放------解决方案--------------------------------------------------------delete []crTemp; //这是光清除申请的内存? 对,释放内存有意义,否则crTemp仍然指向那个地址,而该地址可能已经被别的对象占据------解决方案--------------------------------------------------------第一个问题,delete[]crTemp,只释放了申请的内存,ctTemp的值还是指向你已经释放了的内存区的,所以一定要设为NULL。第二个问题,dc这个指针本身是临时变量,在函数结束时,它本身会被释放掉,但是它所指向的DC资源却没有归回,相当于在第一个问题中,你没有delete[]crTemp,而直接crTemp=NULL了。------解决方案--------------------------------------------------------红猪同学说的很好。这里仅仅做一个补充。在MSDN中说,如果这段代码在一个CWnd类中,GetDC后是不需要释放DC的。但作为一个良好的编程习惯。强烈建议,采用红猪同学的方案。附上MSDN的原话。Unless the device context belongs to a window class, the CWnd::ReleaseDC method must be called to release the context after painting. Since only five common device contexts are available at any given time, failure to release a device context can prevent other applications from accessing a device context.------解决方案--------------------------------------------------------一般来说 new的都要都要释放 不过如果是mfc的封装函数申请的,如果它有释放函数,就直接调用它的释放函数。------解决方案--------------------------------------------------------写了很久程序了。虽然一直用。 可是确实不清楚内涵啊从实际上看,当然这个临时指针变量是会被释放的,不过习惯有时候比技术不是更重要一些吗!------解决方案--------------------------------------------------------第一个只把那个new的释放了就可以,下面的不晓得,学习
7、dataadapter需要释放资源吗
C#会自动回收的,你想要释放也可以的
8、cvqueryframe 需要自己释放吗
需要的,刑满释放人员恢复常住户籍的,可以参照如下办理:一专、事项名称:刑满释属放人员恢复户口;二、设定依据:公安部、省公安厅户籍管理条例。三、申请条件:服刑前为本辖区居民。四、办理材料:1. 原有《户口簿》、《居民身份证》2. 释放证明五、办理流程:申请、受理、审核、办结。
9、php变量需要释放吗
类里面的和函数里面的不需要释放~
反正代码执行完都会被终结的,你想要手动释放的话也没有问题,毕竟释放了节约了一些资源~特别对于大项目来说,很有必要的!
10、cvmat型数据需要释放内存么
关于Opencv 内存泄漏的一些总结
1、内存泄露
内存泄露是说没有释放已经不能使用的内存,这里一般指堆的内存才需要显示的释放。比如用malloc,calloc,realloc,new分配的内存是在堆上的,需要用free,delete显示的回收。内存泄露最明显的一是程序很慢,在运行程序时你可以启动任务管理器,会看到程序占用的内存一直“砰砰砰”的往上涨:最后直接崩溃,或者你关闭程序的时候也会异常退出
1)除了new的对象我们知道要delete。
OpenCV中使用cvCreateImage()新建一个IplImage*,以及使用cvCreateMat()新建一个CvMat*,都需要cvReleaseImage() cvReleaseMat()显示的释放
[cpp] view plaincopyprint?
IplImage* subImg=cvCreateImage( cvSize((img->width)*scale,(img->height)*scale), 8, 3 );
CvMat *tempMat=cvCreateMat((img->width)*scale,(maxFace->height)*scale,CV_MAKETYPE(image->depth,image->nChannels));
cvReleaseImage(&subImg);
cvReleaseMat(&tempMat);
另外一些函数要用到 CvSeq*来存放结果(通常这些都要用cvCreateMemStorage()事先分配一块内存CvMemStorage*),都要是释放掉相应的内存,这是很难找的。
比如从二值图像中寻找轮廓的函数cvFindContours():
[cpp] view plaincopyprint?
CvMemStorage* m_storage=cvCreateMemStorage(0);
CvSeq * m_contour=0;
cvFindContours( img, m_storage, &m_contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
//释放内存
cvReleaseMemStorage(&m_storage);
以及人脸识别中检测人脸的函数:
[cpp] view plaincopyprint?
CvMemStorage* m_storage=cvCreateMemStorage(0);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
CvSeq* faces = cvHaarDetectObjects( img, cascade, m_storage,1.1, 2, 0,cvSize(30, 30) );
//释放内存
<span style="BACKGROUND-COLOR: #ff99ff">cvReleaseMemStorage( &faces->storage);
( &cascade );</span>
注意这里我们可以使用
cvReleaseMemStorage( &faces->storage);
来释放m_storate,也可以使用:
cvReleaseMemStorage(&m_storage); // 释放内存,这是等效的,但一定不要用两次!!
2、关于cvvImage内存泄露
opencv中的CvvImage类多用在MFC中,因为有Show()这个成员函数,在MFC显示图像比IplImage要方便很多。但是同时也有容易疏忽导致内存泄漏的地方。
CvvImage::CopyOf
1
2
void CvvImage::CopyOf(CvvImage& img, intdesired_color);
void CvvImage::CopyOf(IplImage* img, intdesired_color);
从img复制图像到当前的对象中。
img
要复制的图像。
desired_color
为复制后图像的通道数, 复制后图像的像素深度为8bit。
CopyOf()函数会开辟一个新的空间存放图像,不会自动释放。
因此在使用CopyOf()函数后,必须要使用Destroy()函数手动释放内存
如:
CvvImage cimg;
cimg.CopyOf(img,3); //复制为CvvImage结构
cimg.DrawToHDC(hDC,&rect); // 写到HDC中,大小为rect
cimg.Destroy();
3、CDC是Windows绘图设备的基类
其他函数中要使用CDC类,需使用GetDC函数和ReleaseDC函数,实现申请CDC类得指针和释放CDC类的指针。
CDC的使用:OnDraw(CDC* pDC),因此OnDraw中可以直接使用CDC类编写代码。
如:
CDC *pdc = GetDC();
ReleaseDC(pdc);
==================================================================
OpenCV中的内存泄露问题(有些按网上说的效果好像不起作用,内存还是在慢慢长)
1、网上说的 cvLoadImage函数:使用CvvImage类代替。并且使用CvvImage类的Load函数。(我测试后感觉没有什么改善)
使用过程大概如下:
//变量定义:
CvvImage pSrcImg;
IplImag *pSrcImgCopy ;//使用IplImag变量做个拷贝。毕竟IplImag 类处理方便。
//获取图像:
pSrcImg.Load(str);//str为Cstring类型的图像文件名
pSrcImgCopy = pSrcImg.GetImage();//拷贝出pSrcImg的图像数据。
//释放内存
pSrcImg变量不需要每次释放,因为每次Load时是覆盖以前的内存区域。pSrcImgCopy 同样。
不过在程序结束时要释放,以免产生内存泄露或者别人以为你忘了。
cvReleaseImage(&pSrcImgCopy );
pSrcImg.Destroy();
不过要正确释放pSrcImgCopy 时,声明时必须create下:
pSrcImgCopy = cvCreateImage(cvSize(IMGWIDHT,IMGHEIGHT),IPL_DEPTH_8U, 3);
//IMGWIDHT,IMGHEIGHT为图像宽和高。
cvCloneImage函数:用cvCopy函数代替。。(我测试后感觉没有什么改善)
cvCopy(pSrcImg,pImg,NULL);//代替 pImg = cvCloneImage(pSrcImg);
pImg初始化时必须分配空间,否则上述函数不能执行。
pImg = cvCreateImage(cvSize(IMGWIDHT,IMGHEIGHT),IPL_DEPTH_8U, 3);
2. cvGetCols()、cvGetRows()
......
CvMat *srcMat = cvCreateMat(width, height, CV_8UC3); // 创建一个三通道无符号整数类型的矩阵
cvGetCols(frame,srcMat,0,width);
这里出现内存泄露,因为cvGetCols()、cvGetRows() 是为目标矩阵分配一块新的数据内存区域,如果目标矩阵的数据区域之前已经分配了内存,则会原始数据内存区域将变成内存碎片,造成内存泄露。解决方法如下:
CvMat *srcMat = cvCreateMat(width, height, CV_8UC3); // 创建一个三通道无符号整数类型的矩阵
cvReleaseData(srcMat); // 先释放目标矩阵的数据区
cvGetCols(frame,srcMat,0,width);
或者
cvCreateMatHeader(width, height, CV_8UC3);
cvGetCols(frame,srcMat,0,width);
3. IplImag*、CvMat*、CvHistogram* 等结构体指针在使用后要释放。
IplImage *frame= cvCreateImage(cvSize(width,height),8,1);
CvMat *srcMat = cvCreateMat(width, height, CV_8U);
......
CvHistogram *hist = cvCreateHist(1,&histSize,CV_HIST_ARRAY,ranges,1);
......
cvReleaseMat(&srcMat);
cvReleaseImage(&frame);
cvReleaseHist(&hist);